Giả sử bảng này:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Có bốn cách khác nhau để xác định khóa ngoại (khi xử lý một PK cột duy nhất) và tất cả đều dẫn đến cùng một ràng buộc khóa ngoại:
-
Nội tuyến mà không đề cập đến cột mục tiêu:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
Nội tuyến với việc đề cập đến cột mục tiêu:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Nằm ngoài dòng bên trong
create table
:CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer, constraint fk_tests_students foreign key (highestStudent_id) REFERENCES students (student_id) );
-
Dưới dạng một
alter table
riêng biệt tuyên bố:CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer ); alter table tests add constraint fk_tests_students foreign key (highestStudent_id) REFERENCES students (student_id);
Cái nào bạn thích là một vấn đề của hương vị. Nhưng bạn nên nhất quán trong các kịch bản của mình. Hai câu lệnh cuối cùng là tùy chọn duy nhất nếu bạn có khóa ngoại tham chiếu đến một PK bao gồm nhiều hơn một cột - bạn không thể xác định FK "nội tuyến" trong trường hợp đó, ví dụ:foreign key (a,b) references foo (x,y)
Chỉ phiên bản 3) và 4) mới cung cấp cho bạn khả năng xác định tên riêng của bạn cho ràng buộc FK nếu bạn không thích những cái tên do hệ thống tạo từ Postgres.
serial
kiểu dữ liệu không thực sự là một kiểu dữ liệu. Nó chỉ là một ký hiệu viết tay ngắn gọn xác định giá trị mặc định cho cột được lấy từ một chuỗi. Vì vậy, bất kỳ cột nào tham chiếu một cột được xác định là serial
phải được xác định bằng cách sử dụng loại cơ sở thích hợp integer
(hoặc bigint
cho bigserial
cột)