sql >> Database >  >> RDS >> PostgreSQL

postgresql externe sleutel syntaxis

Uitgaande van deze tabel:

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

Er zijn vier verschillende manieren om een ​​refererende sleutel te definiëren (wanneer je te maken hebt met een enkele kolom PK) en ze leiden allemaal tot dezelfde beperking van de refererende sleutel:

  1. Inline zonder de doelkolom te vermelden:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
    
  2. Inline met vermelding van de doelkolom:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
    
  3. Buiten de lijn binnen de 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. Als een aparte alter table verklaring:

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

Welke je voorkeur heeft, is een kwestie van smaak. Maar je moet consistent zijn in je scripts. De laatste twee instructies zijn de enige optie als u externe sleutels hebt die verwijzen naar een PK die uit meer dan één kolom bestaat - u kunt in dat geval de FK niet "inline" definiëren, b.v. foreign key (a,b) references foo (x,y)

Alleen versie 3) en 4) geven je de mogelijkheid om je eigen naam te definiëren voor de FK-beperking als je de door het systeem gegenereerde van Postgres niet leuk vindt.

De serial gegevenstype is niet echt een gegevenstype. Het is slechts een korte handnotatie die een standaardwaarde definieert voor de kolom uit een reeks. Dus elke kolom verwijzend een kolom gedefinieerd als serial moet worden gedefinieerd met behulp van het juiste basistype integer (of bigint voor bigserial kolommen)




  1. Volledige deelname aan SQL

  2. Hoe de opgeslagen procedure in Oracle SQL Developer te bewerken?

  3. globale sql_mode instellen in mysql

  4. ver.2 PyGreSQL ERROR:from _pg import * ImportError:DLL load failed:De opgegeven module kon niet worden gevonden