Foreign Key (FK) คือคีย์ที่สร้างความสัมพันธ์ระหว่าง 2 ตาราง โดยอ้างอิง Primary Key (PK) ของอีกตารางหนึ่ง
ประเภทความสัมพันธ์
1. One-to-One (1:1)
หนึ่ง Record ใน Table A เชื่อมโยงกับหนึ่ง Record ใน Table B เท่านั้น
-- Table A (Parent)
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50)
);
-- Table B (Child) - FK เป็น PK พร้อมกัน
CREATE TABLE user_profiles (
user_id INT PRIMARY KEY,
bio TEXT,
avatar VARCHAR(255),
FOREIGN KEY (user_id) REFERENCES users(id)
);
2. One-to-Many (1:N)
หนึ่ง Record ใน Table A เชื่อมโยงกับหลาย Record ใน Table B
-- Table A (Parent - One)
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(100)
);
-- Table B (Child - Many)
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(id)
);
ตัวอย่างจากบทความ: สร้าง FK ด้วย ALTER TABLE
-- ตาราง Parent (มี PK)
CREATE TABLE tblP (
FK_PK INT PRIMARY KEY,
LastName VARCHAR(100)
);
-- ตาราง Child
CREATE TABLE tblF (
id INT,
FirstName VARCHAR(100),
FK_PK INT
);
-- เพิ่ม Foreign Key
ALTER TABLE tblF
ADD CONSTRAINT ConstFK
FOREIGN KEY (FK_PK) REFERENCES tblP(FK_PK);
ตรวจสอบ FK ที่สร้าง
DESC tblF;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| FirstName | varchar(100) | YES | | NULL | |
| FK_PK | int(11) | YES | MUL | NULL | |
+-----------+--------------+------+-----+---------+-------+
-- Key = MUL หมายถึงเป็น Foreign Key (Non-unique Index)
ON DELETE / ON UPDATE Actions
FOREIGN KEY (dept_id) REFERENCES departments(id)
ON DELETE CASCADE -- ลบ Parent -> ลบ Child ด้วย
ON UPDATE CASCADE -- Update PK -> Update FK ด้วย
-- ตัวเลือกอื่น: SET NULL, RESTRICT, NO ACTION, SET DEFAULT
Best Practice
- ✅ ใช้
CONSTRAINT nameให้ชื่อ Constraint ชัดเจน - ✅ สร้าง Index บน FK Column (MySQL สร้างอัตโนมัติ)
- ✅ ใช้
ON DELETE/UPDATEให้เหมาะสม (CASCADE, SET NULL) - ⚠️ FK เพิ่ม Overhead ตอน INSERT/UPDATE/DELETE
- ⚠️ ต้องใช้ Engine เดียวกัน (InnoDB)