MySQL การใช้งาน FOREIGN KEY Constraint

FOREIGN KEY (คีย์นอก) เป็นข้อกำหนดที่ใช้สร้างความสัมพันธ์ระหว่างสองตาราง ใช้เชื่อมคอลัมน์ในตารางหนึ่ง (ลูก/child) ให้สัมพันธ์กับ PRIMARY KEY หรือ UNIQUE คอลัมน์ในอีกตารางหนึ่ง (แม่/parent) ช่วยควบคุมความสอดคล้องของข้อมูล (Referential Integrity)

ประโยชน์ของ FOREIGN KEY

  • ป้องกันการใส่ค่าที่ไม่มีอยู่ในตารางแม่
  • รักษาความถูกต้องของข้อมูลที่เชื่อมโยงกัน
  • สามารถกำหนดพฤติกรรมเมื่อข้อมูลในตารางแม่ถูกลบหรือแก้ไข (เช่น ON DELETE CASCADE)

รูปแบบการใช้งาน

FOREIGN KEY (column_name)
REFERENCES parent_table (parent_column)
[ON DELETE action]
[ON UPDATE action]
  • column_name คือคอลัมน์ในตารางลูก
  • parent_table(parent_column) คือตารางและคอลัมน์ที่อ้างอิง
  • action เช่น CASCADE, SET NULL, RESTRICT, NO ACTION

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

ตาราง orders อ้างอิง customer_id จากตาราง customers

SQL
CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  name VARCHAR(100)
);

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
  • orders.customer_id ต้องตรงกับ customers.customer_id เท่านั้น
  • หากมีการลบลูกค้า จะต้องพิจารณาว่าจะทำอย่างไรกับคำสั่งซื้อที่เกี่ยวข้อง

เพิ่ม FOREIGN KEY ภายหลัง

SQL
ALTER TABLE orders
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id);
  • fk_customer คือชื่อของ constraint (ตั้งชื่อเองได้)

ใช้ ON DELETE CASCADE

SQL
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON DELETE CASCADE
);
  • หากลบลูกค้า คำสั่งซื้อของลูกค้าคนนั้นจะถูกลบตามไปด้วยอัตโนมัติ

การกำหนดพฤติกรรม ON DELETE / ON UPDATE

  • CASCADE หมายถึง เมื่อลบ/อัปเดตในตารางแม่ ตารางลูกจะลบ/อัปเดตตาม
  • SET NULL หมายถึง เมื่อลบ/อัปเดตในตารางแม่ เซตค่าในตารางลูกเป็น NULL (ต้องรองรับ NULL)
  • RESTRICT หมายถึง ห้ามลบ/อัปเดต ถ้ามีข้อมูลเชื่อมโยงในตารางลูก (default)
  • NO ACTION เหมือน RESTRICT

ข้อควรระวัง

  • คอลัมน์ที่อ้างอิง (FOREIGN KEY) และที่ถูกอ้าง (PRIMARY KEY) ต้องมีชนิดข้อมูลเดียวกัน
  • ตารางแม่ต้องถูกสร้างก่อนตารางลูก
  • ใช้กับ Engine ที่รองรับ Foreign Key เท่านั้น เช่น InnoDB
แชร์เรื่องนี้