Вопрос по sql, postgresql – Как сделать внешний ключ с ограничением на ссылочную таблицу в PostgreSQL

5

Предположим, у меня есть следующие таблицы

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

insert into plugins values (1,'matrix');
insert into plugins values (2,'matrix');
insert into plugins values (3,'function');
insert into plugins values (4,'function');

CREATE TABLE matrix_params (
id int primary key,
pluginid int references plugins (id)
);
</code>

Все это работает, как и ожидалось, но я хотел бы добавить дополнительное ограничение, что matrix_param может ссылаться только на плагин, который имеет тип «матрица». Так

<code>insert into matrix_params values (1,1);
</code>

Должен преуспеть, но

<code>insert into matrix_params values (2,3);
</code>

Должен потерпеть неудачу.

Простое ограничение для matrix_params не работает, поскольку у него нет возможности узнать, какой соответствующий тип находится в таблице плагинов.

Ваш Ответ

3   ответа
2

CHECK ограничение в ссылочной таблице, например

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)
);
Error: User Rate Limit ExceededCHECKError: User Rate Limit ExceededisError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded hsikcah
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
4

тить запрос в ограничение CHECK, но можете вызвать функцию; Итак, мы строим простую функцию, которая говорит нам, еслиpluginid это матрица:

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

и оберните это в ограничение CHECK:

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

Затем:

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

А ФК заботится о ссылочной целостности и каскадах.

Error: User Rate Limit ExceededpluginsError: User Rate Limit ExceededWHEN old.type = 'matrix' and new.type != old.typeError: User Rate Limit Exceededis_matrixError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededreallyError: User Rate Limit Exceededwiki.postgresql.org/wiki/SSI#FK-Like_Constraints

Похожие вопросы