เขียนเว็บ เดอะ ซีรีส์ ตอนที่ 32: คีย์หลักของตาราง (Primary Key)
ทุก ๆ ครั้งที่มีการสร้างตารางภายในฐานข้อมูลควรจะมี 1 คอลัมน์ที่มีข้อมูลไม่ซ้ำกันเพื่อที่เราจะสามารถระบุตำแหน่งของข้อมูลก่อนที่จะทำการแก้ไขหรือลบข้อมูล คอลัมน์ใดที่มีข้อมูลไม่ซ้ำกันเราจะกำหนดให้คอลัมน์นั้นเป็นคีย์หลัก หรือ Primary Key ของตาราง
การจะกำหนดว่าคอลัมน์ใดของตารางเป็น Primary Key เราต้องพิจารณาว่าคอลัมน์นี้จะมีข้อมูลซ้ำกันหรือไม่ ซึ่งโดยทั่วไปข้อมูลที่ไม่ซ้ำกันมักจะเป็นข้อมูลเฉพาะ ยกตัวอย่างถ้าเป็นข้อมูลส่วนบุคคลจะมีเลขบัตรประจำตัวประชาชนที่เป็นข้อมูลเฉพาะ เมื่อมีการสร้างตารางที่ใช้เก็บข้อมูลส่วนบุคคล เลขบัตรประจำตัวประชาชนมักจะถูกกำหนดให้เป็น Primary Key ของตาราง
นอกจากข้อมูลที่ไม่ซ้ำกันแล้ว คอลัมน์ที่จะเป็น Primary Key จะต้องไม่มีค่า NULL (หรือระบุค่าไม่ได้) อยู่ในคอลัมน์ด้วย
ตัวอย่างต่อไปนี้จะเป็นการสร้างฐานข้อมูลเพื่อจัดเก็บข้อมูลท่าอากาศยานต่าง ๆ ทั่วโลก
ท่าอากาศยานทั่วโลกจะมีข้อมูลต่าง ๆ เช่น ชื่อท่าอากาศยาน ที่ตั้ง จำนวนผู้โดยสารเฉลี่ยต่อปี เป็นต้น แต่ท่าอากาศยานจะมีข้อมูลเฉพาะที่ไม่ซ้ำกัน คือ “รหัสท่าอากาศยาน” เมื่อมีการสร้างตารางเก็บข้อมูลรายชื่อท่าอากาศยาน เราสามารถกำหนดให้รหัสท่าอากาศยานเป็น Primary Key ได้
เริ่มต้นให้สร้างฐานข้อมูลชื่อ airport_db กำหนดให้รองรับรหัสอักขระ utf8_unicode_ci จากนั้นให้สร้างตารางชื่อ airport_list โดยมี 5 คอลัมน์ พร้อมตั้งค่าต่าง ๆ (ยังไม่ต้องคลิก Save เพื่อสร้างตาราง) ตามภาพด้านล่าง (ดูวิธีการสร้างฐานข้อมูลและตารางในตอนที่ 27, 28, 29)
รายละเอียดของแต่ละคอลัมน์ในตาราง airport_list มีดังนี้
- airport_code คือ รหัสท่าอากาศยาน โดยในตัวอย่างนี้จะใช้รหัสตัวอักษร 4 ตัว ตามมาตรฐานขององค์การการบินพลเรือนระหว่างประเทศ (ICAO) ซึ่งแต่ละท่าอากาศยานจะมีรหัสที่ไม่ซ้ำกัน
- airport_name คือ ชื่อท่าอากาศยาน
- location_city คือ เมืองที่ตั้งของท่าอากาศยาน
- location_state คือ รัฐ/มลรัฐ/จังหวัด ที่ตั้งของท่าอากาศยาน
- location_country คือ ประเทศที่ตั้งของท่าอากาศยาน
ถ้าต้องการให้คอลัมน์ airport_code เป็น Primary Key ให้ไปที่ Index แล้วเลือก PRIMARY (กรอบสีแดงตามภาพ)
คลิก Go เพื่อกำหนดให้คอลัมน์ airport_code เป็น Primary Key
เมื่อกำหนด Primary Key เรียบร้อยแล้วให้คลิก Save เพื่อสร้างตาราง และเมื่อมาที่หน้า Structure จะพบกับรูปกุญแจสีเหลืองในคอลัมน์ airport_code เพื่อบ่งบอกว่าคอลัมน์ airport_code เป็น Primary Key
และในหมวด Indexes ที่อยู่ด้านล่างรายการคอลัมน์ จะมีข้อมูลคีย์แสดงอยู่ว่ามี 1 คีย์ที่เป็น Primary Key บนคอลัมน์ airport_code
ถ้าต้องการลบ Primary Key ให้มาที่หมวด Indexes ที่อยู่ด้านล่างรายการคอลัมน์ แล้วคลิก Drop
ระบบจะถามว่าต้องการลบ Primary Key หรือไม่ ให้คลิก OK
เมื่อคลิก OK ที่คอลัมน์ airport_code จะไม่มีรูปกุญแจสีเหลือง และที่หมวด Indexes จะไม่มีข้อมูล Primary Key
และถ้าต้องการกำหนดให้คอลัมน์ airport_code เป็น Primary Key อีกครั้ง ให้ไปที่ More บนแถวคอลัมน์ airport_code
จากนั้นเลือก “Primary” ที่มีรูปกุญแจสีเหลือง
ระบบจะถามว่าต้องการกำหนด Primary Key ให้กับคอลัมน์ airport_code หรือไม่ ให้คลิก OK
เมื่อคลิก OK ระบบจะแจ้งว่าได้กำหนดให้คอลัมน์ airport_code เป็น Primary Key แล้ว โดยดูจากรูปกุญแจสีเหลืองที่คอลัมน์ airport_code และมีข้อมูลคีย์ในหมวด Indexes
ข้อมูลเพิ่มเติม:
- เราสามารถพิมพ์คำสั่งภาษา SQL ในการกำหนดให้คอลัมน์ใดเป็น Primary Key โดยตรงได้ ไม่ว่าจะกำหนดก่อน/หลัง การสร้างตาราง รวมทั้งสามารถใช้คำสั่งภาษา SQL ในการลบ Primary Key ออกจากคอลัมน์ได้ด้วย
- Primary Key สามารถมีมากกว่า 1 คอลัมน์ต่อ 1 ตารางก็ได้ แต่การสร้างระบบฐานข้อมูลที่ดี ใน 1 ตาราง ควรจะมี Primary Key เพียง 1 คอลัมน์เท่านั้น
- ควรจะกำหนด Primary Key ในตารางให้เรียบร้อยก่อนทำการเพิ่มข้อมูลลงในตารางทุกครั้ง
ทดลองเพิ่มข้อมูลลงในตาราง
ให้พิมพ์คำสั่งภาษา SQL เพื่อเพิ่มข้อมูลดังนี้
INSERT INTO airport_list VALUES ('KATL', 'Hartsfield–Jackson Atlanta International Airport', 'Atlanta', 'Georgia', 'United States'),
('ZBAA', 'Beijing Capital International Airport', 'Chaoyang-Shunyi', 'Beijing', 'China'),
('KLAX', 'Los Angeles International Airport', 'Los Angeles', 'California', 'United States'),
('RJTT', 'Tokyo Haneda Airport', 'Ōta', 'Tokyo', 'Japan'),
('EGLL', 'London Heathrow Airport', 'Hillingdon', 'London', 'United Kingdom'),
('ZSPD', 'Shanghai Pudong International Airport', 'Pudong', 'Shanghai', 'China'),
('RKSI', 'Seoul Incheon International Airport', '', 'Incheon', 'South Korea'),
('EDDF', 'Frankfurt Airport', 'Frankfurt', 'Hesse', 'Germany'),
('WSSS', 'Singapore Changi Airport', 'Changi', 'East Region', 'Singapore'),
('VTBS', 'Suvarnabhumi Airport', 'Bang Phli', 'Samut Prakan', 'Thailand');
เมื่อเพิ่มข้อมูลแล้ว ตารางจะมีรายการข้อมูลตามภาพด้านล่าง โดยระบบจะเรียงตามตัวอักษรของรหัสท่าอากาศยานในคอลัมน์ airport_code จาก A ถึง Z ให้โดยอัตโนมัติ
ต่อไปให้พิมพ์คำสั่งเพิ่มข้อมูล “ท่าอากาศดอนเมือง” ดังนี้
INSERT INTO airport_list VALUES ('VTBS', 'Don Mueang International Airport', 'Don Mueang', 'Bangkok', 'Thailand');
เมื่อให้คำสั่งทำงานระบบจะแจ้งข้อผิดพลาดว่าไม่สามารถเพิ่มข้อมูลได้เนื่องจากมีรหัส “VTBS” อยู่ในตารางอยู่แล้ว
โดยรหัส VTBS อยู่ในคอลัมน์ airport_code เป็นรหัสท่าอากาศยานของท่าอากาศสุวรรณภูมิ
เมื่อมีรหัส VTBS อยู่ในตารางแล้ว เราจึงไม่สามารถเพิ่มข้อมูลที่เป็นรหัส VTBS เหมือนกันได้เนื่องจากเรากำหนดให้คอลัมน์ airport_code เป็น Primary Key ข้อมูลที่เป็น Primary Key จึงไม่สามารถซ้ำกันได้ และถ้ามีการแก้ไขข้อมูล จะไม่สามารถแก้ไขข้อมูลให้มีรหัสท่าอากาศยานซ้ำกันได้ด้วยเช่นกัน
แต่ถ้าพิมพ์คำสั่งเพิ่มข้อมูล “ท่าอากาศดอนเมือง” เป็นดังนี้
INSERT INTO airport_list VALUES ('VTBD', 'Don Mueang International Airport', 'Don Mueang', 'Bangkok', 'Thailand');
ระบบจะแจ้งว่าได้เพิ่มข้อมูลเรียบร้อยแล้ว เนื่องจากเราใช้รหัสท่าอากาศยานเป็น “VTBD” ซึ่งยังไม่มีข้อมูลรหัสนี้อยู่ในตาราง เราจึงสามารถเพิ่มข้อมูลท่าอากาศยานดอนเมืองลงในตาราง airport_list ได้
ในฐานข้อมูลโดยทั่วไปไม่ได้มีเพียง 1 ตารางเท่านั้น โดยฐานข้อมูลแต่ละฐานจะมีจำนวนตารางมากน้อยแตกต่างกันไปตามระบบที่มีการพัฒนา การที่ต้องมีหลายตารางก็เพื่อให้มีความง่ายต่อการบริหารจัดการ โดยบางตารางจะมีคอลัมน์ที่มีข้อมูลชุดเดียวกัน เพื่อสามารถเชื่อมต่อข้อมูลระหว่างตารางต่าง ๆ ได้
ยกตัวอย่างเช่นฐานข้อมูล airport_db นี้ ในตาราง airport_list จะมีข้อมูลชื่อประเทศที่ตั้งของท่าอากาศยานอยู่ในคอลัมน์ location_country ซึ่งเราสามารถแบ่งข้อมูลประเทศที่ตั้งออกมาเป็นอีกตารางหนึ่งได้ โดยให้ข้อมูลในคอลัมน์ location_country เป็นรหัสประเทศแทนการใช้ชื่อประเทศ แล้วสร้างตารางใหม่โดยตั้งชื่อตารางใหม่นี้ว่า country มี 2 คอลัมน์ คือ country_code (รหัสประเทศ) และ country_name (ชื่อประเทศ)
หมายเหตุ:
- รหัสประเทศที่ใช้ในตัวอย่างนี้ยึดตามมาตรฐาน ISO 3166–1 alpha-2 ขององค์การระหว่างประเทศว่าด้วยการมาตรฐาน หรือ ISO
จะเห็นว่าทั้งตาราง airport_list และตาราง country มีข้อมูลที่ตรงกัน คือ รหัสประเทศในคอลัมน์ location_country ของตาราง airport_list และรหัสประเทศในคอลัมน์ country_code ของตาราง country โดยเราสามารถกำหนดให้คอลัมน์ location_country เป็นคีย์นอก หรือ Foreign Key ของตาราง airport_list ได้ และสามารถให้ตาราง airport_list เชื่อมต่อกับตาราง country ได้เนื่องจากมีข้อมูลรหัสประเทศเหมือนกัน
สำหรับคีย์นอก หรือ Foreign Key จะมีการอธิบายเพิ่มเติมในตอนต่อ ๆ ไป
Primary Key นอกจากจะเป็นตัวช่วยระบุตำแหน่งของข้อมูลในตารางแล้ว ยังสามารถช่วยในการจัดเรียงลำดับข้อมูลได้อีกด้วย โดยฟังก์ชันหนึ่งที่ใช้ในการจัดเรียงลำดับข้อมูล คือ ลำดับข้อมูลอัตโนมัติ หรือ Auto Increment
ลำดับข้อมูลอัตโนมัติ (Auto Increment)
Auto Increment เป็นฟังก์ชันที่สำคัญสำหรับคอลัมน์ที่เป็น Primary Key เมื่อเพิ่มข้อมูลลงในตารางแล้ว ตารางจะสร้างลำดับของข้อมูลเป็น 1, 2, 3,… ให้เองโดยอัตโนมัติ ซึ่งลำดับของข้อมูลที่ถูกสร้างจะเก็บไว้ในคอลัมน์ที่เป็น Primary Key โดย Auto Increment จะมีค่าเริ่มต้น คือ 1 และจะเพิ่มลำดับมาทีละ 1 ลำดับ
ให้เข้าไปที่ฐานข้อมูล airport_db แล้วสร้างตารางใหม่ชื่อ airport_list_thai เพื่อใช้เก็บข้อมูลท่าอากาศยานในประเทศไทย โดยมี 5 คอลัมน์ พร้อมตั้งค่าต่าง ๆ (ยังไม่ต้องคลิก Save เพื่อสร้างตาราง) ตามภาพด้านล่าง
รายละเอียดของแต่ละคอลัมน์ในตาราง airport_list_thai มีดังนี้
- airport_no คือ ลำดับข้อมูลของท่าอากาศยานซึ่งเราจะกำหนดประเภทของข้อมูล (Data type) ให้เป็น Int เพื่อใช้ในการตั้งค่า Auto Increment
- airport_code คือ รหัสท่าอากาศยาน โดยในตัวอย่างนี้จะใช้รหัสตัวอักษร 4 ตัว ตามมาตรฐานขององค์การการบินพลเรือนระหว่างประเทศ (ICAO) ซึ่งแต่ละท่าอากาศยานจะมีรหัสที่ไม่ซ้ำกัน
- airport_name คือ ชื่อท่าอากาศยาน
- province คือ จังหวัดที่ตั้งของท่าอากาศยาน
- response_agency คือ หน่วยงานที่รับผิดชอบท่าอากาศยาน
ที่คอลัมน์ airport_no จะมีหมวด A_I อยู่ข้าง ๆ Index ให้ทำเครื่องหมายถูกที่ช่องของ A_I เพื่อตั้งค่า Auto Increment โดยระบบจะกำหนดให้คอลัมน์ airport_no เป็น Primary Key ให้เองโดยอัตโนมัติ พร้อมทั้งให้คอลัมน์ airport_no มีการเรียงลำดับแบบ Auto Increment
เมื่อกำหนด Primary Key และ Auto Increment เรียบร้อยแล้วให้คลิก Save เพื่อสร้างตาราง และเมื่อมาที่หน้า Structure จะพบกับรูปกุญแจสีเหลืองในคอลัมน์ airport_no และมีคำว่า “AUTO_INCREMENT” อยู่ในหมวด Extra (กรอบสีแดงตามภาพ) เพื่อบอกให้รู้ว่าคอลัมน์ airport_no เป็น Primary Key และมีการเรียงลำดับของข้อมูลแบบ Auto Increment
ถ้าต้องการลบ Auto Increment ให้คลิก Change
จากนั้นนำเครื่องหมายถูกออกจากช่อง A_I (กรอบสีแดงตามภาพ) เสร็จเรียบร้อยแล้วให้คลิก Save
เมื่อคลิก Save แล้ว จะไม่มีคำว่า “AUTO_INCREMENT” ในหมวด Extra ของคอลัมน์ airport_no แล้ว
ถ้าจะกลับไปตั้งค่า Auto Increment เหมือนเดิมให้คลิกที่ Change แล้วทำเครื่องหมายถูกลงในช่อง A_I คอลัมน์ airport_no ก็จะกลับมาเป็น Auto Increment เหมือนเดิม
ทดลองเพิ่มข้อมูลใน Auto Increment
ให้พิมพ์คำสั่งภาษา SQL เพื่อเพิ่มข้อมูลดังนี้
INSERT INTO airport_list_thai (airport_code, airport_name, province, response_agency) VALUES ('VTBS', 'ท่าอากาศยานสุวรรณภูมิ', 'สมุทรปราการ', 'บริษัท ท่าอากาศยานไทย จำกัด (มหาชน)'),
('VTCT', 'ท่าอากาศยานแม่ฟ้าหลวง เชียงราย', 'เชียงราย', 'บริษัท ท่าอากาศยานไทย จำกัด (มหาชน)'),
('VTUD', 'ท่าอากาศยานอุดรธานี', 'อุดรธานี', 'กรมท่าอากาศยาน'),
('VTBU', 'ท่าอากาศยานอู่ตะเภา', 'ระยอง', 'กองทัพเรือ'),
('VTSM', 'ท่าอากาศยานนานาชาติสมุย', 'สุราษฎร์ธานี', 'บริษัท การบินกรุงเทพ จำกัด (มหาชน)');
คำอธิบาย:
- ในการพิมพ์คำสั่ง INSERT สำหรับกรณีนี้ เนื่องจากเราจะเพิ่มข้อมูลลงในทุกคอลัมน์ยกเว้นคอลัมน์ airport_no จึงต้องมีการกำหนดคอลัมน์ที่ต้องการเพิ่มข้อมูลต่อจากชื่อตาราง
- สำหรับคอลัมน์ airport_no ระบบจะทำการเพิ่มข้อมูลให้โดยอัตโนมัติ โดยจะเป็นการเพิ่มเลขลำดับของข้อมูลจากฟังก์ชัน Auto Increment ที่ได้มีการตั้งค่าเอาไว้ก่อนหน้า
เมื่อเพิ่มข้อมูลแล้ว ตารางจะมีรายการข้อมูลตามภาพด้านล่าง โดยระบบจะเรียงตามเลขลำดับของข้อมูลในคอลัมน์ airport_no ให้โดยอัตโนมัติ โดยจะเริ่มตั้งแต่ลำดับข้อมูลที่ 1
ถ้ามีการเพิ่มข้อมูลเพิ่มเติม ลำดับของข้อมูลจะเพิ่มขึ้นเรื่อย ๆ โดยจะเพิ่มขึ้นมาทีละ 1 ถึงแม้ว่าจะมีการลบข้อมูลออกไปแล้วแต่ลำดับของข้อมูลก็จะเพิ่มขึ้นเรื่อย ๆ โดยลำดับของข้อมูลจะนับต่อจากลำดับล่าสุด
สรุป
- คอลัมน์ใดที่มีข้อมูลไม่ซ้ำกันเราจะกำหนดให้คอลัมน์นั้นเป็นคีย์หลัก หรือ Primary Key ของตาราง
- นอกจากข้อมูลที่ไม่ซ้ำกันแล้ว คอลัมน์ที่จะเป็น Primary Key จะต้องไม่มีค่า NULL (หรือระบุค่าไม่ได้) อยู่ในคอลัมน์
- ข้อมูลที่ไม่ซ้ำกันสามารถเป็นได้ทั้งตัวเลขอย่างเดียว ตัวอักษรอย่างเดียว หรือตัวเลขผสมตัวอักษร
- สามารถพิมพ์คำสั่งภาษา SQL โดยตรงในการกำหนดให้คอลัมน์ใดเป็น Primary Key หรือลบ Primary Key ออกจากคอลัมน์ได้
- Primary Key สามารถมีมากกว่า 1 คอลัมน์ต่อ 1 ตารางก็ได้ แต่การสร้างระบบฐานข้อมูลที่ดี ใน 1 ตาราง ควรจะมี Primary Key เพียง 1 คอลัมน์เท่านั้น
- ควรจะกำหนด Primary Key ในตารางให้เรียบร้อยก่อนทำการเพิ่มข้อมูลลงในตารางทุกครั้ง
- Primary Key นอกจากจะเป็นตัวช่วยระบุตำแหน่งของข้อมูลในตารางแล้ว ยังสามารถใช้ฟังก์ชันลำดับข้อมูลอัตโนมัติ (Auto Increment) เพื่อช่วยในการจัดเรียงลำดับข้อมูลได้อีกด้วย