Двойной внешний ключ в postgresql - PullRequest
14 голосов
/ 14 февраля 2012

Я пытаюсь использовать двойной первичный ключ в качестве внешнего ключа.

Create table AAA (
   AAA_id int primary key
);

create table BBB (
   AAA_id int,
   BBB_name character varying(20),
   primary key (AAA_id, BBB_name)
);

create table CCC (
    AAA_id,
    BBB_name,
    DDD_id,

    ... ???
);

таблица ААА является объектом

Таблица BBB много к одному с AAA и содержит псевдонимы AAA

Я пытаюсь создать сводную таблицу, CCC, которая содержит много к одному между DDD и BBB.

Наверное, я хочу что-то вроде

create table CCC (
    AAA_id,
    BBB_name,
    DDD_id,
    foreign key (AAA_id, BBB_name) references BBB(AAA_id, BBB_name) on update cascade
);

где AAA_id и BBB_name являются внешними ключами, но они также всегда ссылаются на одну и ту же строку в BBB.

но, конечно, это недопустимо. Каков наилучший способ создать такой тип поведения в PostgreSQL?

1 Ответ

19 голосов
/ 14 февраля 2012
Create temp table AAA (
   AAA_id int primary key
);

create temp table BBB (
   AAA_id int not null references AAA (AAA_id),
   BBB_name character varying(20) not null,
   primary key (AAA_id, BBB_name)
);

create temp table CCC (
    AAA_id int not null,
    BBB_name character varying(20) not null,
    DDD_id integer not null,
    -- Guessing at the primary key.
    primary key (AAA_id, BBB_name, DDD_id),
    foreign key (AAA_id, BBB_name) references BBB (AAA_id, BBB_name) 
        on update cascade
);

Поскольку {AAA_id, BBB_name} однозначно идентифицирует строку в BBB, внешний ключ {AAA_id, BBB_name} в CCC также будет ссылаться на одну уникальную строку в BBB.

...