PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

синтаксис на външния ключ на postgresql

Ако приемем тази таблица:

CREATE TABLE students 
( 
  student_id SERIAL PRIMARY KEY,
  player_name TEXT
);

Има четири различни начина за дефиниране на външен ключ (когато се работи с една колона PK) и всички те водят до едно и също ограничение на външния ключ:

  1. Вграден без упоменаване на целевата колона:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
    
  2. Вградено със споменаване на целевата колона:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
    
  3. Извън реда вътре в 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. Като отделна alter table изявление:

    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);
    

Кой предпочитате е въпрос на вкус. Но трябва да сте последователни в своите скриптове. Последните две изрази са единствената опция, ако имате външни ключове, препращащи към PK, който се състои от повече от една колона - не можете да дефинирате FK "inline" в този случай, напр. foreign key (a,b) references foo (x,y)

Само версии 3) и 4) ще ви дадат възможност да дефинирате собствено име за FK ограничението, ако не харесвате генерираните от системата такива от Postgres.

serial типът данни всъщност не е тип данни. Това е просто кратка нотация на ръка, която дефинира стойност по подразбиране за колоната, взета от последователност. Така че всяка колона препраща колона, дефинирана като serial трябва да се дефинира с помощта на подходящия основен тип integer (или bigint за bigserial колони)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqlalchemy.exc.NoSuchModuleError:Не мога да заредя плъгин:sqlalchemy.dialects:postgres

  2. Грешка в PostgreSQL:Фатално:потребителското име на ролята не съществува

  3. Как да вмъкнете и изтриете данни в PostgreSQL

  4. PostgreSQL СЪЗДАВАНЕ НА ТАБЛИЦА

  5. Как pg_sleep() работи в PostgreSQL