Подтвердить что ты не робот

Двойной внешний ключ в postgresql

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

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?

4b9b3361

Ответ 1

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.