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.
Để 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.
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) );
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);
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 );
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';
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;
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.