การเชื่อมโยงข้อมูล Primary Key (PK) และ Foreign Key (FK) ใน MySql

SQL Knowledge ทั้ง sql มาตรฐาน หลักการออกแบบฐานข้อมูล ความสัมพันธ์ของ ตาราง Mysql , PGSQL, Oracle, MSSQL

Moderator: mindphp, ผู้ดูแลกระดาน

Sakana
PHP Super Member
PHP Super Member
โพสต์: 378
ลงทะเบียนเมื่อ: 16/06/2025 9:38 am

การเชื่อมโยงข้อมูล Primary Key (PK) และ Foreign Key (FK) ใน MySql

โพสต์ที่ยังไม่ได้อ่าน โดย Sakana »

ในยุคปัจจุบันที่ข้อมูลมีบทบาทสำคัญอย่างยิ่งต่อธุรกิจและการดำเนินงานต่างๆ การจัดการข้อมูลให้เป็นระบบและมีความสัมพันธ์กันอย่างถูกต้องเป็นสิ่งจำเป็น ฐานข้อมูลเชิงสัมพันธ์ (Relational Database) ถูกออกแบบมาเพื่อตอบโจทย์นี้ โดยมีแนวคิดหลักคือการจัดเก็บข้อมูลในรูปแบบตาราง (Tables) ที่เชื่อมโยงกัน เพื่อหลีกเลี่ยงความซ้ำซ้อนของข้อมูล (Data Redundancy) และรักษาความสมบูรณ์ของข้อมูล (Data Integrity)
หัวใจสำคัญของการเชื่อมโยงตารางเหล่านี้คือแนวคิดของ 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)
);
ในตัวอย่างนี้ customer_id ถูกกำหนดให้เป็น Primary Key พร้อมกับคุณสมบัติ AUTO_INCREMENT ซึ่งหมายความว่าเมื่อคุณเพิ่มข้อมูลลูกค้าใหม่โดยไม่ได้ระบุ customer_id ระบบฐานข้อมูลจะจัดการสร้าง ID ที่ไม่ซ้ำกันให้โดยอัตโนมัติ

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)
);
ในตัวอย่างนี้ order_id ถูกกำหนดให้เป็น Primary Key แบบ AUTO_INCREMENT เช่นเดียวกับ customer_id ในตาราง Customers และ customer_id ในตาราง Orders ถูกกำหนดให้เป็น Foreign Key ที่อ้างอิง (REFERENCES) ไปยัง customer_id ซึ่งเป็น Primary Key ในตาราง Customers นี่หมายความว่าค่า customer_id ใดๆ ที่ใส่ลงในตาราง Orders จะต้องมีอยู่จริงในตาราง Customers เท่านั้น

การใช้ 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');
ผลลัพธ์:
SQL Knowledge-1.png
SQL Knowledge-1.png (21.06 KiB) Viewed 77 times
2. เพิ่มข้อมูลลงในตาราง Orders
ในตาราง 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);   -- สมชาย ใจดี สั่งซื้อครั้งที่สาม
ผลลัพธ์:
SQL Knowledge-4.png
SQL Knowledge-4.png (15.37 KiB) Viewed 77 times
ตัวอย่าง: ดึงข้อมูลลูกค้าพร้อมรายการสั่งซื้อ
สมมติเราต้องการดูว่าลูกค้าแต่ละคนสั่งซื้ออะไรไปบ้าง เราจะเชื่อมตาราง 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

ผลลัพธ์:
SQL Knowledge-1.png
SQL Knowledge-1.png (20.08 KiB) Viewed 77 times
ในผลลัพธ์นี้ คุณจะเห็นข้อมูลจากทั้งสองตารางถูกรวมเข้าด้วยกัน โดยที่แถวของลูกค้าแต่ละคนจะปรากฏซ้ำหากพวกเขามีรายการสั่งซื้อหลายรายการ

สรุป
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
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: Majestic-12 [Bot] และบุคลทั่วไป 1