How to make a foreign key with a constraint on the referenced table in PostgreSQL

后端 未结 3 550
自闭症患者
自闭症患者 2021-01-05 19:59

Suppose I have the following tables

CREATE TABLE plugins (
id int primary key,
type text);

insert into plugins values (1,\'matrix\');
insert into plugins va         


        
相关标签:
3条回答
  • 2021-01-05 20:47

    Use a compound key in the referenced table and a CHECK constraint in the referencing table e.g.

    CREATE TABLE plugins (
    id int primary key,
    type text, 
    UNIQUE (type, id)
    );
    
    CREATE TABLE matrix_params (
    id int primary key,
    plugintype text DEFAULT 'matrix' NOT NULL
       CHECK (plugintype = 'matrix'),
    pluginid int NOT NULL,
    FOREIGN KEY (plugintype, pluginid)
       references plugins (type, id)
    );
    
    0 讨论(0)
  • 2021-01-05 21:00

    You can use a CHECK constraint for this. You can't put a query in a CHECK constraint but you can call a function; so, we build a simple function that tells us if a pluginid is a matrix:

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

    and wrap that in a CHECK constraint:

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

    Then:

    => 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"
    

    And the FK takes care of referential integrity and cascades.

    0 讨论(0)
  • 2021-01-05 21:05

    One way of handling this is to use serializable transactions.

    http://wiki.postgresql.org/wiki/SSI#FK-Like_Constraints

    0 讨论(0)
提交回复
热议问题