2013-11-17 5 views
0

Мне нужно удалить связанные строки из таблицы «назначить», когда член экипажа будет удален.Удаление связанных строк из других таблиц без первичного ключа

Однако, когда я создаю таблицы, я получаю ошибку:

ERROR: there is no unique constraint matching given keys for referenced table "assign" 

Кажется, что мне нужно различные значения в таблице «Заданные», но все дело в том, что я хочу, чтобы удалить все когда информация о членах экипажа удалена. Как я могу это сделать?

create table flight(
    flight_num BIGSERIAL PRIMARY KEY, 
    source_city varchar, 
    dest_city varchar, 
    dep_time int, 
    arr_time int, 
    airfare int, 
    mileage int 
); 

create table crew (
    id BIGSERIAL PRIMARY KEY, 
    name varchar, 
    salary int, 
    position varchar, 
    seniority int, 
    fly_hours int, 
    mgrid int, 
    FOREIGN KEY (id) REFERENCES assign(id) ON DELETE CASCADE 
); 

create table assign (
    id int, # refers to a crew member id, not a row id 
    flight_num int 
); 
+0

Чтобы уточнить, столбец «id» в присваивании относится к идентификатору члена экипажа, поэтому он может иметь несколько одинаковых идентификаторов в этом столбце, поскольку один член экипажа может быть назначен нескольким полетам. –

ответ

3

иностранные ключи должны находиться на М-М присоединиться к таблице, а так:

create table flight(
    flight_num int PRIMARY KEY, 
    -- etc 
); 

create table crew (
    crew_id int PRIMARY KEY, 
    -- etc 
); 

create table assign (
    crew_id int, 
    flight_num int, 
    -- If the corresponding record in either of these FKs is deleted then 
    -- this record will be deleted. 
    FOREIGN KEY (crew_id) REFERENCES crew(crew_id) ON DELETE CASCADE, 
    FOREIGN KEY (flight_num) REFERENCES flight(flight_num) ON DELETE CASCADE, 
    -- M-M usually should have a PK over both foreign columns, arranged in order 
    -- of expected usage. A reverse covering index can be added if needed. 
    PRIMARY KEY (flight_num, crew_id) 
); 

В этом случае ФКС разрешено, потому что они являются более уникальными колоннами (ПКС crew и flight). Исходная ошибка заключается в том, что на цель FK не было уникального ограничения (assign.crew_id).

Смежные вопросы