Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

Foreign Key คืออะไร?

บทความนี้อธิบายถึง Foreign Key ซึ่งเป็นคอลัมน์ที่เชื่อมโยงข้อมูลระหว่างตารางโดยอ้างอิงไปยัง Primary Key ของอีกตารางหนึ่ง โดยมีประโยชน์ในการเชื่อมโยงข้อมูล, รักษ...

Foreign Key คืออะไร? เชื่อมโยงข้อมูลในฐานข้อมูลของคุณ

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับ Primary Key ซึ่งเป็นกุญแจสำคัญในการระบุแต่ละแถวในตารางของเราอย่างไม่ซ้ำกัน แต่ถ้าเราต้องการเชื่อมโยงข้อมูลระหว่างหลายๆ ตารางล่ะ? นั่นแหละคือหน้าที่ของ Foreign Key!

Foreign Key (คีย์นอก) คือคอลัมน์หรือกลุ่มของคอลัมน์ในตารางหนึ่ง ที่อ้างอิงไปยัง Primary Key ของอีกตารางหนึ่ง (หรืออาจจะเป็นตารางเดียวกันก็ได้) มันสร้างความสัมพันธ์ระหว่างสองตาราง ทำให้เราสามารถเชื่อมโยงข้อมูลที่เกี่ยวข้องเข้าด้วยกันได้ ลองนึกภาพว่ามันเป็น "กุญแจ" ที่ไขไปสู่ข้อมูลในอีกตารางหนึ่ง

ทำไมต้องใช้ Foreign Key?

การใช้ Foreign Key มีประโยชน์มากมาย:

  • เชื่อมโยงข้อมูล: ช่วยให้เราเชื่อมโยงข้อมูลที่เกี่ยวข้องจากหลายตารางเข้าด้วยกันได้อย่างง่ายดาย
  • Referential Integrity: รักษาความถูกต้องและความสอดคล้องของข้อมูลในฐานข้อมูล โดยป้องกันไม่ให้เราใส่ข้อมูลที่ไม่ถูกต้องหรือไม่สอดคล้องกับความสัมพันธ์ที่กำหนดไว้
  • ลดความซ้ำซ้อนของข้อมูล: แทนที่จะเก็บข้อมูลเดียวกันไว้ในหลายตาราง เราสามารถเก็บไว้ในตารางเดียวแล้วใช้ Foreign Key เชื่อมโยงไปยังตารางอื่นๆ ได้
  • ปรับปรุงประสิทธิภาพ: การเชื่อมโยงข้อมูลด้วย Foreign Key ทำให้การสืบค้นข้อมูล (Query) มีประสิทธิภาพมากขึ้น

ตัวอย่าง Foreign Key

สมมติว่าเรามีสองตาราง:

  • Customers: เก็บข้อมูลลูกค้า (CustomerID, Name, Email) โดย `CustomerID` เป็น Primary Key
  • Orders: เก็บข้อมูลการสั่งซื้อ (OrderID, CustomerID, OrderDate)

ในตาราง `Orders` คอลัมน์ `CustomerID` จะเป็น Foreign Key ที่อ้างอิงไปยัง `CustomerID` ในตาราง `Customers` ซึ่งหมายความว่าแต่ละ Order จะต้องมี CustomerID ที่ตรงกับ Customer ที่มีอยู่ในตาราง `Customers` เท่านั้น

การสร้าง Foreign Key

เราสามารถสร้าง Foreign Key ได้ตอนสร้างตาราง (CREATE TABLE) หรือแก้ไขตารางที่มีอยู่แล้ว (ALTER TABLE) มาดูตัวอย่างการสร้าง Foreign Key ตอนสร้างตารางกันก่อน:

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY AUTO_INCREMENT,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

คำอธิบาย:

  • `FOREIGN KEY (CustomerID)`: กำหนดว่าคอลัมน์ `CustomerID` ในตาราง `Orders` เป็น Foreign Key
  • `REFERENCES Customers(CustomerID)`: ระบุว่า Foreign Key นี้อ้างอิงไปยังคอลัมน์ `CustomerID` ในตาราง `Customers`

เรายังสามารถเพิ่ม Foreign Key ให้กับตารางที่มีอยู่แล้วได้ด้วยคำสั่ง `ALTER TABLE`:

ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

Referential Integrity คืออะไร?

Referential Integrity คือกฎที่ MySQL ใช้เพื่อรักษาความถูกต้องและความสอดคล้องของความสัมพันธ์ระหว่างตารางต่างๆ เมื่อเรากำหนด Foreign Key แล้ว MySQL จะตรวจสอบว่าข้อมูลที่ถูกเพิ่มหรือแก้ไขนั้นสอดคล้องกับความสัมพันธ์ที่กำหนดไว้หรือไม่

ตัวอย่างเช่น:

  • การเพิ่มข้อมูล: เราไม่สามารถเพิ่ม Order ที่มี CustomerID ที่ไม่มีอยู่ในตาราง Customers ได้
  • การแก้ไขข้อมูล: เราไม่สามารถแก้ไข CustomerID ในตาราง Orders เป็นค่าที่ไม่มีอยู่ในตาราง Customers ได้
  • การลบข้อมูล: โดยค่าเริ่มต้น เราจะไม่สามารถลบ Customer ที่มี Order อยู่ในตาราง Orders ได้ (เราจะพูดถึงวิธีแก้ไขปัญหานี้ในหัวข้อถัดไป)

ถ้าเราพยายามที่จะละเมิดกฎ Referential Integrity MySQL จะแสดงข้อผิดพลาดออกมา

ON DELETE CASCADE คืออะไร?

เมื่อเราพยายามลบข้อมูลในตารางหลัก (เช่น ลบ Customer ในตาราง Customers) ที่มีการอ้างอิงอยู่ในตารางอื่น (เช่น Orders ในตาราง Orders) MySQL จะป้องกันไม่ให้เราลบข้อมูลนั้น เพื่อรักษากฎ Referential Integrity

แต่ในบางกรณี เราอาจต้องการให้การลบข้อมูลในตารางหลัก ส่งผลกระทบไปยังข้อมูลในตารางที่อ้างอิงด้วย เช่น เมื่อเราลบ Customer เราก็ต้องการให้ Orders ทั้งหมดของ Customer นั้นถูกลบไปด้วย เราสามารถทำได้โดยใช้ `ON DELETE CASCADE`

`ON DELETE CASCADE` คือ option ที่เราสามารถกำหนดให้กับ Foreign Key เพื่อบอกให้ MySQL ทำการลบข้อมูลที่อ้างอิงอยู่ในตารางที่เกี่ยวข้องโดยอัตโนมัติ เมื่อข้อมูลในตารางหลักถูกลบ

ตัวอย่าง:

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY AUTO_INCREMENT,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE CASCADE
);

ในตัวอย่างนี้ เมื่อเราลบ Customer จากตาราง Customers Orders ทั้งหมดที่มี CustomerID นั้นก็จะถูกลบออกจากตาราง Orders โดยอัตโนมัติ

ข้อควรระวัง: การใช้ `ON DELETE CASCADE` ควรพิจารณาอย่างรอบคอบ เพราะมันอาจทำให้ข้อมูลถูกลบโดยไม่ตั้งใจได้ ตรวจสอบให้แน่ใจว่าคุณเข้าใจผลกระทบของการใช้ option นี้ก่อนที่จะใช้งาน

ตัวอย่างการใช้งาน Foreign Key อย่างง่าย

ลองมาดูตัวอย่างการใช้งาน Foreign Key อย่างง่ายๆ กัน

1. สร้างตาราง `Customers`

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY AUTO_INCREMENT,
    Name VARCHAR(255),
    Email VARCHAR(255)
);

2. สร้างตาราง `Orders`

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY AUTO_INCREMENT,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

3. เพิ่มข้อมูลลงในตาราง `Customers`

INSERT INTO Customers (Name, Email) VALUES
('John Doe', 'john.doe@example.com'),
('Jane Smith', 'jane.smith@example.com');

4. เพิ่มข้อมูลลงในตาราง `Orders`

INSERT INTO Orders (CustomerID, OrderDate) VALUES
(1, '2023-10-27'),
(2, '2023-10-28');

5. ลองดึงข้อมูล Orders พร้อมกับชื่อลูกค้า

SELECT Orders.OrderID, Customers.Name, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

คำสั่ง SQL นี้จะดึงข้อมูล OrderID, ชื่อลูกค้า, และวันที่สั่งซื้อ โดยใช้ `INNER JOIN` เพื่อเชื่อมโยงข้อมูลจากตาราง `Orders` และ `Customers` โดยใช้ Foreign Key `CustomerID`

สรุป

Foreign Key เป็นเครื่องมือที่สำคัญในการสร้างความสัมพันธ์ระหว่างตารางต่างๆ ในฐานข้อมูล MySQL มันช่วยให้เราเชื่อมโยงข้อมูลที่เกี่ยวข้องเข้าด้วยกัน รักษาความถูกต้องของข้อมูล และปรับปรุงประสิทธิภาพในการสืบค้นข้อมูล อย่าลืมทำความเข้าใจหลักการ Referential Integrity และ option `ON DELETE CASCADE` เพื่อใช้งาน Foreign Key ได้อย่างมีประสิทธิภาพ

ในบทต่อไป เราจะเรียนรู้เกี่ยวกับการเพิ่มข้อมูลลงในตาราง (INSERT INTO) เตรียมตัวให้พร้อม!

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service