PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como fazer uma chave estrangeira com uma restrição na tabela referenciada no PostgreSQL


Você pode usar uma restrição CHECK para isso. Você não pode colocar uma consulta em uma restrição CHECK, mas pode chamar uma função; então, construímos uma função simples que nos diz se um pluginid é uma 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;

e envolva isso em uma restrição CHECK:
alter table matrix_params add constraint chk_is_matrix check (is_matrix(pluginid));

Então:
=> 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"

E o FK cuida da integridade referencial e das cascatas.