Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ทำความเข้าใจ Foreign Key ใน MySQL: One-to-One และ One-to-Many

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)