Khóa ngoại (Foreign Key) là gì?
Khóa ngoại là một cột (column) hoặc một nhóm các cột trong một bảng tham chiếu tới một hàng trong một bảng khác. Nói cách khác, khóa ngoại được xác định trong bảng tham chiếu đến khóa chính của bảng khác.
Một bảng có thể có nhiều khóa ngoại tùy thuộc vào mối quan hệ của nó với các bảng khác.
Trong PostgreSQL, bạn xác định khóa ngoại thông qua ràng buộc khóa ngoại. Ràng buộc khóa ngoài chỉ ra rằng các giá trị trong một cột hoặc một nhóm các cột trong bảng con khớp với các giá trị trong một cột hoặc một nhóm các cột của bảng cha.
Định nghĩa khóa ngoại (Foreign Key) khi tạo bảng
Để định nghĩa 1 column là 1 khóa ngoại khi tạo bảng, chúng ta sử dụng từ khóa: REFERENCES
Cú pháp:
CREATE TABLE <table_name_1> ( <column_name_1> <data_type> REFERENCES <table_name_2>(<column_name_2>), );
Ví dụ: Chúng ta có 2 bảng users và groups có mối quan hệ như sau:
Với group_id của bảng users là column có rằng buộc khóa ngoại liên kết tới khóa chính của của bảng groups
Để tạo bảng users có group_id là column có rằng buộc khóa ngoại, chúng ta sử dụng câu lệnh SQL sau:
CREATE TABLE public.users ( user_id integer NOT NULL, group_id integer REFERENCES groups(group_id), username character varying COLLATE pg_catalog."default" NOT NULL, password character varying COLLATE pg_catalog."default" NOT NULL, email character varying COLLATE pg_catalog."default", created_at timestamp without time zone NOT NULL, updated_at timestamp without time zone, deleted_at timestamp without time zone )
Chú ý: Bảng groups cần phải tạo trước.
Ngoài ra có thể sử dụng keyword: FOREIGN KEY
CREATE TABLE public.users ( user_id integer NOT NULL, group_id integer NOT NULL, username character varying COLLATE pg_catalog."default" NOT NULL, password character varying COLLATE pg_catalog."default" NOT NULL, email character varying COLLATE pg_catalog."default", created_at timestamp without time zone NOT NULL, updated_at timestamp without time zone, deleted_at timestamp without time zone, FOREIGN KEY (group_id) REFERENCES groups(group_id) )
Định nghĩa khóa ngoại cho một tập hợp các column
Trong trường hợp khóa ngoại là một nhóm cột, chúng ta định nghĩa khóa ngoại như sau:
CREATE TABLE child_table( child_column_1 INTEGER PRIMARY KEY, child_column_2 INTEGER, child_column_3 INTEGER, FOREIGN KEY (child_column_2 , child_column_3 ) REFERENCES parent_table (parent_column_1, parent_column_2) );
Ví dụ: Chúng ta có 2 bảng CSDL là employee (Bảng con) và company (Bảng cha) có mối quan hệ như sau:
Lệnh SQL tạo bảng employee có khóa ngoại liên kết tới bảng company như sau:
CREATE TABLE public.employee ( employee_id integer NOT NULL PRIMARY KEY, company_id integer, company_code integer, fullname character varying, position character varying, salary money, created_at timestamp without time zone NOT NULL, updated_at timestamp without time zone, deleted_at timestamp without time zone, FOREIGN KEY (company_id , company_code ) REFERENCES company (company_id, company_code) )
Thêm khóa ngoại vào bảng
Để thêm một ràng buộc khóa ngoại vào bảng hiện có, bạn sử dụng câu lệnh ALTER TABLE như sau:
ALTER TABLE child_table ADD CONSTRAINT constraint_name FOREIGN KEY (child_column_1) REFERENCES parent_table (parent_column_1);
Ví dụ: Thêm column group_id vào thêm khóa ngoại liên kết tới bảng groups
ALTER TABLE employee ADD COLUMN group_id integer; ALTER TABLE employee ADD CONSTRAINT fk_group_id FOREIGN KEY (group_id) REFERENCES groups(group_id);