PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

cú pháp khóa ngoại postgresql

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:

  1. 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
    );
    
  2. 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)
    );
    
  3. 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)
    );
    
  4. 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)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn cho phần tử của mảng trong cột JSON

  2. Hội nghị mùa xuân FLOSS Vương quốc Anh

  3. Có gì mới trong PostgreSQL 11

  4. Cách tăng kết nối tối đa trong PostgreSQL

  5. Dự phòng &Dự phòng cho PostgreSQL trên Microsoft Azure