หัวใจสำคัญของการเชื่อมโยงตารางเหล่านี้คือแนวคิดของ Primary Key (PK) และ Foreign Key (FK) ซึ่งเป็นคีย์หลักที่ใช้กำหนดความสัมพันธ์ระหว่างข้อมูลในตารางต่างๆ
Primary Key (PK) คืออะไร?
Primary Key (คีย์หลัก) คือ คอลัมน์ (Column) หรือชุดของคอลัมน์ในตารางที่ใช้สำหรับ:
- ระบุแถว (Record) แต่ละแถวได้อย่างไม่ซ้ำกัน (Uniquely Identify): ค่าในคอลัมน์ PK ของแต่ละแถวจะต้องไม่ซ้ำกันเลย และแต่ละแถวจะต้องมีค่า PK เสมอ (ห้ามเป็น NULL)
- เป็นตัวแทนของแถวนั้นๆ: PK ทำหน้าที่เป็น "ที่อยู่" หรือ "รหัสประจำตัว" ของแต่ละแถว ทำให้เราสามารถอ้างอิงถึงข้อมูลนั้นๆ ได้อย่างแม่นยำ
คุณสมบัติสำคัญของ Primary Key:
- Unique (ไม่ซ้ำกัน): ไม่มีสองแถวใดที่มีค่า PK เหมือนกัน
- Not NULL (ไม่เป็นค่าว่าง): ทุกแถวต้องมีค่า PK
- มีได้เพียงหนึ่ง PK ต่อหนึ่งตาราง: แต่ PK อาจประกอบด้วยหลายคอลัมน์รวมกัน (Composite Primary Key)
- นิยมใช้ AUTO_INCREMENT / IDENTITY: ในการใช้งานจริง ID ของ PK มักจะถูกกำหนดให้เพิ่มค่าอัตโนมัติเมื่อมีการเพิ่มข้อมูลใหม่ เพื่อให้มั่นใจว่าค่าจะไม่ซ้ำกันและไม่ต้องจัดการด้วยตนเอง
ตัวอย่างการสร้างตารางพร้อม Primary Key (และ Auto-increment ID):
สมมติเรามีตาราง Customers สำหรับเก็บข้อมูลลูกค้า:
โค้ด: เลือกทั้งหมด
CREATE TABLE Customers (
customer_id INT PRIMARY KEY AUTO_INCREMENT, -- กำหนด customer_id เป็น Primary Key และเพิ่มค่าอัตโนมัติ
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100) UNIQUE,
phone_number VARCHAR(20)
);
Foreign Key (FK) คืออะไร?
Foreign Key (คีย์นอก/คีย์อ้างอิง) คือ คอลัมน์หรือชุดของคอลัมน์ในตารางหนึ่ง ที่ใช้สำหรับ "เชื่อมโยง" ไปยัง Primary Key ของอีกตารางหนึ่ง (หรืออาจเป็น PK ของตารางเดียวกันก็ได้ในบางกรณี)
บทบาทของ Foreign Key:
- สร้างความสัมพันธ์ (Relationship) ระหว่างตาราง: FK ทำหน้าที่เป็นสะพานเชื่อมข้อมูลจากตารางหนึ่งไปยังอีกตารางหนึ่ง
- รักษาความสมบูรณ์ของข้อมูลเชิงอ้างอิง (Referential Integrity): ช่วยให้มั่นใจว่าข้อมูลที่ถูกอ้างอิงถึงนั้นมีอยู่จริงในตารางต้นฉบับ เช่น ถ้ามีรายการสั่งซื้อในตาราง Orders ที่อ้างอิงถึง customer_id 101 ในตาราง Customers ระบบจะตรวจสอบให้แน่ใจว่า customer_id 101 นั้นมีอยู่ในตาราง Customers จริงๆ
คุณสมบัติสำคัญของ Foreign Key:
- ค่าในคอลัมน์ FK สามารถซ้ำกันได้ (เพราะลูกค้าหนึ่งคนอาจมีหลายรายการสั่งซื้อ)
- ค่าในคอลัมน์ FK สามารถเป็น NULL ได้ (เว้นแต่จะกำหนด NOT NULL) ซึ่งหมายความว่าข้อมูลนั้นไม่มีการอ้างอิงถึง
- ค่าในคอลัมน์ FK จะต้องมีอยู่ในคอลัมน์ Primary Key ของตารางที่อ้างอิงถึงเท่านั้น (หรือเป็น NULL)
ตัวอย่างการสร้างตารางพร้อม Foreign Key (และ Auto-increment ID):
สมมติเรามีตาราง Orders ที่ต้องการเชื่อมโยงกับลูกค้าในตาราง Customers:
โค้ด: เลือกทั้งหมด
CREATE TABLE Orders (
order_id INT PRIMARY KEY AUTO_INCREMENT, -- กำหนด order_id เป็น Primary Key และเพิ่มค่าอัตโนมัติ
customer_id INT NOT NULL, -- คอลัมน์ที่จะใช้เป็น Foreign Key (กำหนด NOT NULL เพื่อบังคับว่าต้องมีลูกค้าเสมอ)
order_date DATE,
total_amount DECIMAL(10, 2),
-- กำหนด customer_id เป็น Foreign Key ที่อ้างอิง customer_id ในตาราง Customers
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);
การใช้ SQL เพื่อเชื่อมโยงตาราง (JOIN)
เมื่อคุณได้กำหนด Primary Key และ Foreign Key เพื่อสร้างความสัมพันธ์ระหว่างตารางแล้ว คุณสามารถใช้คำสั่ง SQL JOIN เพื่อดึงข้อมูลจากหลายๆ ตารางมารวมกันได้
คำสั่ง JOIN ที่พบบ่อยที่สุดคือ INNER JOIN ซึ่งจะคืนค่าแถวที่ "ตรงกัน" ในทั้งสองตารางเท่านั้น
ตัวอย่างข้อมูลสำหรับตาราง Customers และ Orders
เพื่อให้เห็นภาพการทำงานของ Primary Key และ Foreign Key รวมถึงการ JOIN ข้อมูลได้ชัดเจนขึ้น เรามาลองเพิ่มข้อมูลสมมติลงในตาราง Customers และ Orders ที่เราได้สร้างไว้กันครับ
1. เพิ่มข้อมูลลงในตาราง Customers
ในตาราง Customers เรามี customer_id เป็น Primary Key แบบ AUTO_INCREMENT ดังนั้นเราไม่จำเป็นต้องระบุค่า customer_id ในคำสั่ง INSERT ก็ได้ ระบบจะสร้างให้โดยอัตโนมัติ
โค้ด: เลือกทั้งหมด
-- ข้อมูลลูกค้า
INSERT INTO Customers (first_name, last_name, email, phone_number) VALUES
('สมชาย', 'ใจดี', '[email protected]', '0812345678'),
('สมศรี', 'มีสุข', '[email protected]', '0823456789'),
('มานะ', 'สบายใจ', '[email protected]', '0834567890'),
('สุดา', 'รักเรียน', '[email protected]', '0845678901');
ในตาราง Orders เรามี order_id เป็น Primary Key แบบ AUTO_INCREMENT และ customer_id เป็น Foreign Key ที่อ้างอิงถึง customer_id ในตาราง Customers ดังนั้นค่า customer_id ที่เราจะใส่ในตาราง Orders จะต้องมีอยู่จริงในตาราง Customers
โค้ด: เลือกทั้งหมด
-- ข้อมูลรายการสั่งซื้อ
INSERT INTO Orders (customer_id, order_date, total_amount) VALUES
(1, '2024-05-10', 1250.00), -- สมชาย ใจดี สั่งซื้อ
(1, '2024-05-12', 300.50), -- สมชาย ใจดี สั่งซื้ออีกครั้ง
(2, '2024-05-11', 2500.75), -- สมศรี มีสุข สั่งซื้อ
(3, '2024-05-13', 150.00), -- มานะ สบายใจ สั่งซื้อ
(2, '2024-05-15', 899.00), -- สมศรี มีสุข สั่งซื้ออีกครั้ง
(1, '2024-05-18', 75.25); -- สมชาย ใจดี สั่งซื้อครั้งที่สาม
สมมติเราต้องการดูว่าลูกค้าแต่ละคนสั่งซื้ออะไรไปบ้าง เราจะเชื่อมตาราง Customers กับตาราง Orders โดยใช้คอลัมน์ customer_id ที่เป็น FK ใน Orders และ PK ใน Customers:
โค้ด: เลือกทั้งหมด
SELECT
C.first_name,
C.last_name,
O.order_id,
O.order_date,
O.total_amount
FROM
Customers C -- กำหนด alias 'C' ให้ตาราง Customers
INNER JOIN
Orders O ON C.customer_id = O.customer_id; -- กำหนด alias 'O' ให้ตาราง Orders
- SELECT C.first_name, C.last_name, O.order_id, O.order_date, O.total_amount: เลือกคอลัมน์ที่ต้องการแสดงผล โดยใช้ Alias (ชื่อย่อ) ของตารางนำหน้าเพื่อระบุว่าคอลัมน์นั้นมาจากตารางใด (เช่น C.first_name หมายถึงคอลัมน์ first_name จากตาราง Customers)
- FROM Customers C: ระบุตารางหลักคือ Customers และกำหนดชื่อย่อเป็น C
- INNER JOIN Orders O ON C.customer_id = O.customer_id;: เชื่อม (JOIN) กับตาราง Orders (ชื่อย่อ O) โดยมีเงื่อนไขการเชื่อมคือค่าในคอลัมน์ customer_id ของตาราง Customers จะต้องเท่ากับค่าในคอลัมน์ customer_id ของตาราง Orders
ผลลัพธ์: ในผลลัพธ์นี้ คุณจะเห็นข้อมูลจากทั้งสองตารางถูกรวมเข้าด้วยกัน โดยที่แถวของลูกค้าแต่ละคนจะปรากฏซ้ำหากพวกเขามีรายการสั่งซื้อหลายรายการ
สรุป
Primary Key (PK) และ Foreign Key (FK) คือแนวคิดพื้นฐานแต่ทรงพลังในการออกแบบและจัดการฐานข้อมูลเชิงสัมพันธ์ PK ทำหน้าที่เป็นรหัสประจำตัวที่ไม่ซ้ำกันของแต่ละแถวในตาราง และมักจะถูกกำหนดให้เพิ่มค่าอัตโนมัติ (เช่น AUTO_INCREMENT) เพื่อความสะดวกและมั่นใจในการไม่ซ้ำกัน ในขณะที่ FK ทำหน้าที่เป็นตัวเชื่อมโยงความสัมพันธ์ระหว่างตารางต่างๆ โดยการอ้างอิงไปยัง PK ของอีกตารางหนึ่ง การทำความเข้าใจและใช้ PK/FK อย่างถูกต้อง ไม่เพียงแต่ช่วยให้ข้อมูลของคุณเป็นระเบียบและมีความสมบูรณ์ แต่ยังช่วยให้คุณสามารถดึงข้อมูลที่ซับซ้อนจากหลายตารางมารวมกันได้อย่างมีประสิทธิภาพด้วยคำสั่ง JOIN ใน SQL
ลิ้งค์อ้างอิง
- https://www.mindphp.com/คู่มือ/73-คืออะ ... ออะไร.html
- viewtopic.php?t=36147
- viewtopic.php?t=18425
- viewtopic.php?t=61746
- viewtopic.php?t=36147
- viewtopic.php?t=51874