Khóa ngoại (foreign key) trong PostgreSQL là một ràng buộc được sử dụng để liên kết hai bảng với nhau. Khóa ngoại giúp duy trì tính toàn vẹn của dữ liệu bằng cách đảm bảo rằng giá trị của cột trong bảng này phải tồn tại trong cột khóa chính (primary key) của bảng khác. Dưới đây là hướng dẫn chi tiết về cách sử dụng khóa ngoại trong PostgreSQL.

1. Tạo Khóa Ngoại

Để tạo khóa ngoại, bạn có thể định nghĩa nó trong câu lệnh CREATE TABLE khi tạo bảng hoặc sử dụng câu lệnh ALTER TABLE để thêm khóa ngoại vào một bảng đã tồn tại.

a. Tạo Khóa Ngoại Khi Tạo Bảng

Cú pháp:

CREATE TABLE child_table (
    id SERIAL PRIMARY KEY,
    parent_id INT,
    CONSTRAINT fk_parent FOREIGN KEY (parent_id) REFERENCES parent_table (id)
);

Ví dụ:

CREATE TABLE departments (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    department_id INT,
    CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments (id)
);

b. Thêm Khóa Ngoại Vào Bảng Đã Tồn Tại

Cú pháp:

ALTER TABLE child_table
ADD CONSTRAINT fk_name FOREIGN KEY (column_name) REFERENCES parent_table (column_name);

Ví dụ:

ALTER TABLE employees
ADD CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments (id);

2. Ràng Buộc và Hành Động Khi Xóa hoặc Cập Nhật

Khi tạo khóa ngoại, bạn có thể xác định hành động sẽ xảy ra khi bản ghi trong bảng cha (parent table) bị xóa hoặc cập nhật. Các hành động thường được sử dụng bao gồm:

  • ON DELETE CASCADE: Khi bản ghi trong bảng cha bị xóa, tất cả các bản ghi liên quan trong bảng con cũng sẽ bị xóa.
  • ON DELETE SET NULL: Khi bản ghi trong bảng cha bị xóa, giá trị của cột khóa ngoại trong bảng con sẽ được đặt thành NULL.
  • ON UPDATE CASCADE: Khi giá trị khóa chính trong bảng cha bị thay đổi, giá trị khóa ngoại trong bảng con cũng sẽ được cập nhật tự động.

Ví dụ:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    department_id INT,
    CONSTRAINT fk_department FOREIGN KEY (department_id) 
        REFERENCES departments (id)
        ON DELETE CASCADE
);

3. Kiểm Tra Khóa Ngoại

Sau khi tạo khóa ngoại, bạn có thể kiểm tra các ràng buộc khóa ngoại trong cơ sở dữ liệu bằng cách sử dụng câu lệnh:

SELECT
    conname AS constraint_name,
    conrelid::regclass AS table_name,
    a.attname AS column_name,
    confrelid::regclass AS foreign_table_name,
    af.attname AS foreign_column_name
FROM
    pg_constraint AS c
JOIN
    pg_attribute AS a ON a.attnum = ANY(c.conkey) AND a.attrelid = c.conrelid
JOIN
    pg_attribute AS af ON af.attnum = ANY(c.confkey) AND af.attrelid = c.confrelid
WHERE
    c.contype = 'f';

4. Xóa Khóa Ngoại

Nếu bạn cần xóa một khóa ngoại, bạn có thể sử dụng câu lệnh ALTER TABLE với DROP CONSTRAINT.

Cú pháp:

ALTER TABLE child_table
DROP CONSTRAINT fk_name;

Ví dụ:

ALTER TABLE employees
DROP CONSTRAINT fk_department;

Kết luận

Khóa ngoại là một phần quan trọng trong việc duy trì tính toàn vẹn của dữ liệu trong PostgreSQL. Bằng cách sử dụng khóa ngoại, bạn có thể thiết lập các mối quan hệ giữa các bảng và đảm bảo rằng dữ liệu luôn nhất quán. Việc sử dụng các hành động xóa và cập nhật hợp lý cũng giúp quản lý dữ liệu hiệu quả hơn.