Primary Key กับ Foreign Key เป็นคำที่ได้ยินบ่อยมากเวลาเริ่มออกแบบฐานข้อมูลใน Access แต่หลายคนยังงงว่าใช้จริงยังไง และต่างจากรหัสทั่วไปตรงไหน
ถ้าเข้าใจสองคำนี้ จะเริ่มสร้าง Relationship ได้มั่นใจขึ้น และจะรู้ว่าทำไม Table ที่ดีไม่ควรเชื่อมกันด้วยชื่อหรือข้อความยาว ๆ
Primary Key คือรหัสประจำแถว
Primary Key คือ field ที่ใช้ระบุว่าแถวนี้คือข้อมูลตัวไหนแบบไม่ซ้ำกับใคร
ตัวอย่าง
Customer.CustomerIDProduct.ProductIDOrder.OrderID
ถ้า Table ลูกค้ามีลูกค้า 1,000 คน CustomerID ต้องบอกได้ว่าลูกค้าแต่ละคนคือแถวไหน ไม่ควรมีซ้ำ และไม่ควรเปลี่ยนไปมา
ใน Access เรามักใช้ AutoNumber เป็น Primary Key เพราะง่ายและปลอดภัยพอสำหรับงานทั่วไป Access จะสร้างเลขให้เอง เช่น 1, 2, 3, 4 โดยเราไม่ต้องคิดเอง
Foreign Key คือรหัสของ Table อื่น
Foreign Key คือ field ที่เก็บ Primary Key จาก Table อื่น เพื่อบอกว่าแถวนี้เกี่ยวข้องกับข้อมูลตัวไหน
ตัวอย่าง Order มี field CustomerID
CustomerID ใน Table Customer คือ Primary Key ของลูกค้า แต่ CustomerID ใน Table Order คือ Foreign Key เพราะมันเอารหัสลูกค้ามาเก็บไว้เพื่อบอกว่าใบสั่งซื้อนี้เป็นของลูกค้าคนไหน
พูดง่าย ๆ คือ
- Primary Key: รหัสของตารางตัวเอง
- Foreign Key: รหัสของตารางอื่นที่เอามาอ้างอิง
ตัวอย่างงานขาย
สมมติเรามี Table ลูกค้าและใบสั่งซื้อ
Customer
CustomerIDเป็น Primary KeyCustomerNamePhone
Order
OrderIDเป็น Primary KeyCustomerIDเป็น Foreign KeyOrderDate
ถ้าใบสั่งซื้อแถวหนึ่งมี CustomerID = 15 แปลว่าใบสั่งซื้อนั้นเป็นของลูกค้าที่มีรหัส 15 ใน Table Customer
เราไม่ต้องพิมพ์ชื่อลูกค้าไว้ใน Order ทุกแถว เพราะชื่อลูกค้าอยู่ใน Table Customer อยู่แล้ว
ทำไมไม่ใช้ชื่อเป็น Key
คำถามนี้สำคัญครับ
ถ้าใช้ชื่อเป็นตัวเชื่อม เช่น CustomerName ปัญหาคือ
- ลูกค้าชื่อซ้ำกันได้
- สะกดชื่อผิดได้
- ลูกค้าเปลี่ยนชื่อได้
- ข้อความยาวกว่าและจัดการยากกว่ารหัส
สมมติลูกค้าชื่อ "สมชาย" มี 3 คน ถ้าเราใช้ชื่อเป็นตัวเชื่อม ระบบจะไม่รู้ว่าใบสั่งซื้อนี้เป็นของสมชายคนไหน
ดังนั้นเราจึงใช้รหัสที่แน่นอน เช่น CustomerID เป็น Key แล้วให้ชื่อเป็นข้อมูลประกอบ
AutoNumber ใช้โชว์ลูกค้าได้ไหม
AutoNumber เหมาะกับรหัสภายในระบบ แต่ไม่ควรยึดเป็นรหัสที่ผู้ใช้ต้องจำเสมอไปครับ
เช่น ลูกค้าอาจอยากเห็นรหัสแบบ CUST001 หรือสินค้าอาจมีรหัสแบบ PRD-0001 แบบนี้ควรสร้าง field เพิ่ม เช่น CustomerCode หรือ ProductCode
แนวทางที่ใช้บ่อยคือ
CustomerIDเป็น AutoNumber Primary Key ภายในระบบCustomerCodeเป็นรหัสที่ผู้ใช้เห็น และตั้งไม่ให้ซ้ำ
แบบนี้ระบบยังเชื่อมด้วย ID ที่นิ่ง ส่วนผู้ใช้ก็ยังมีรหัสที่อ่านง่าย
Relationship ใช้ Key สองฝั่ง
เวลาเปิดหน้าต่าง Relationships ใน Access (ไปที่แท็บ Database Tools แล้วคลิกปุ่ม Relationships) เราจะลาก Primary Key จาก Table หนึ่งไปหา Foreign Key ในอีก Table หนึ่ง
เช่นลาก Customer.CustomerID ไปหา Order.CustomerID
ถ้าตั้งชนิดข้อมูลถูก Access จะสร้างความสัมพันธ์แบบ 1 ต่อหลายให้ได้ง่าย คือ ลูกค้า 1 คนมีใบสั่งซื้อได้หลายใบ
จุดที่ต้องระวังคือ field ที่เชื่อมกันต้องชนิดเข้ากัน เช่น AutoNumber ฝั่ง Primary Key มักเชื่อมกับ Number แบบ Long Integer ฝั่ง Foreign Key
สรุป
Primary Key และ Foreign Key ไม่ใช่ศัพท์ไว้จำสอบครับ แต่มันคือเครื่องมือหลักในการทำให้ Table คุยกันรู้เรื่อง
ถ้าจำง่าย ๆ ให้จำว่า Primary Key คือรหัสของตัวเอง ส่วน Foreign Key คือรหัสของคนอื่นที่เอามาเก็บไว้เพื่อบอกความสัมพันธ์
พอเข้าใจจุดนี้ การสร้าง Query รวมข้อมูลหลาย Table หรือทำ Form แบบ Master/Detail (ฟอร์มที่มีข้อมูลหลักกับรายการย่อยในหน้าเดียว เช่น ใบสั่งซื้อกับรายการสินค้าในใบนั้น) จะง่ายขึ้นมากครับ
บทความที่เกี่ยวข้อง
คำถามที่พบบ่อย
Primary Key ใช้ AutoNumber ได้ไหม
ได้ และมักเหมาะกับรหัสภายในระบบ เพราะไม่ซ้ำและ Access จัดการให้เอง แต่ถ้าต้องมีรหัสที่ผู้ใช้เห็น เช่น รหัสลูกค้า ควรมี field แยกต่างหาก
Foreign Key ต้องตั้งเป็น Primary Key ด้วยไหม
ไม่ต้อง Foreign Key คือ field ที่เก็บรหัสของอีก Table เพื่อบอกว่าแถวนี้เกี่ยวข้องกับข้อมูลตัวไหน ฝั่งที่เป็นหลายมักเก็บ Foreign Key ของฝั่งหนึ่ง
ใช้ชื่อลูกค้าแทน CustomerID ได้ไหม
ไม่แนะนำ เพราะชื่อซ้ำได้ สะกดผิดได้ และเปลี่ยนได้ ควรใช้รหัสที่แน่นอนเป็นตัวเชื่อม แล้วเก็บชื่อเป็นรายละเอียด

