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