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

Cómo hacer una clave externa con una restricción en la tabla de referencia en PostgreSQL

Puede usar una restricción CHECK para esto. No puede poner una consulta en una restricción CHECK pero puede llamar a una función; entonces, construimos una función simple que nos dice si un pluginid es una matriz:

create or replace function is_matrix(int) returns boolean as $$
    select exists (
        select 1
        from plugins
        where id   = $1
          and type = 'matrix'
    );
$$ language sql;

y envuélvelo en una restricción CHECK:

alter table matrix_params add constraint chk_is_matrix check (is_matrix(pluginid));

Entonces:

=> insert into matrix_params values (1,1);
=> insert into matrix_params values (2,3);
ERROR:  new row for relation "matrix_params" violates check constraint "chk_is_matrix"

Y el FK se encarga de la integridad referencial y las cascadas.