sql >> Base de Datos >  >> RDS >> PostgreSQL

sintaxis de clave externa postgresql

Asumiendo esta tabla:

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

Hay cuatro formas diferentes de definir una clave externa (cuando se trata de una PK de una sola columna) y todas conducen a la misma restricción de clave externa:

  1. En línea sin mencionar la columna de destino:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
    
  2. En línea con mencionar la columna de destino:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
    
  3. Fuera de línea dentro 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. Como una alter table separada declaración:

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

Cuál prefieres es cuestión de gustos. Pero debe ser consistente en sus guiones. Las últimas dos declaraciones son la única opción si tiene claves externas que hacen referencia a un PK que consta de más de una columna; no puede definir el FK "en línea" en ese caso, p. foreign key (a,b) references foo (x,y)

Solo las versiones 3) y 4) le permitirán definir su propio nombre para la restricción FK si no le gustan las generadas por el sistema desde Postgres.

El serial tipo de datos no es realmente un tipo de datos. Es solo una notación abreviada que define un valor predeterminado para la columna tomada de una secuencia. Así que cualquier columna haciendo referencia una columna definida como serial debe definirse usando el tipo base apropiado integer (o bigint para bigserial columnas)