2012-02-07 1 views
0

Я очень не знаком с внешними ключами и операциями CASCADE, и мне интересно, о следующем:Зарубежный ключ CASCADE DELETE для таблицы с несколькими родителями?

Предположим, у меня есть две совершенно разные родительские таблицы (ЧЕЛОВЕК и АЛЬЕНИ) с совершенно разными данными. Теперь я хочу создать дочернюю таблицу с именем SPACESHIP, так как и люди, и инопланетяне могут владеть космическими кораблями, причем FK будет указывать либо на строку в HUMAN, либо на строку в ALIEN, в надежде, что если я удалю либо человеческий ряд или чужой ряд, он будет каскадом. Удалите соответствующие строки космического корабля, принадлежащие соответствующему родителю. Есть ли хороший способ сделать это с помощью FK и CASCADE DELETE? Или я должен просто иметь столбцы в HUMAN и ALIEN, вызываемые spaceship_id, и обрабатывать удаление космических кораблей вручную/через триггер? Некоторые другие действия?

Помощь!

ответ

0

Если вы используете механизм хранения , то вы можете использовать внешние ключи, потому что в настоящее время поддерживается только InnoDB. В противном случае вы можете использовать triggers или удалить родительские и дочерние записи, используя один запрос и т.д .:

DELETE HUMAN, SPACESHIP 
FROM HUMAN 
JOIN SPACESHIP 
    ON HUMAN.id = SPACESHIP.id 
WHERE HUMAN.id = 1; 
1

Это может быть решена путем добавления таблицы Supertype (позволяет называть его Being), который имеет в качестве подтипов двух Human и Alien таблицы. Тогда ограничение FOREIGN KEY будет ссылаться на эту таблицу суперэпидов.

супертипе:

CREATE TABLE Being 
(BeingId INT AUTO_INCREMENT 
, ... other stuff about beings 
, PRIMARY KEY (BeingId) 
) ENGINE = InnoDB ; 

подтипы:

CREATE TABLE Human 
(BeingId INT       --- not AUTO_INCREMENT 
, ... other stuff about humans 
, PRIMARY KEY (BeingId) 
, CONSTRAINT Being_Human_fk 
    FOREIGN KEY (BeingId) 
     REFERENCES Being(BeingId) 
     ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = InnoDB ; 

CREATE TABLE Alien 
(BeingId INT       --- not AUTO_INCREMENT 
, ... other stuff about aliens 
, PRIMARY KEY (BeingId) 
, CONSTRAINT Being_Alien_fk 
    FOREIGN KEY (BeingId) 
     REFERENCES Being(BeingId) 
     ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = InnoDB ; 

и Spaceship стол:

CREATE TABLE Spaceship 
(SpaceshipId 
, SpaceshipName 
, OwnerId 
, ... other stuff about spaceships 
, PRIMARY KEY (SpaceshipId) 
, CONSTRAINT Being_Spaceship_fk 
    FOREIGN KEY (OwnerId) 
     REFERENCES Being(BeingId) 
     ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = InnoDB ; 
+0

спасибо, я делал вещи, как это раньше; Я не знаю, могу ли я использовать эту стратегию в своем текущем проекте (примеры не совсем ЧЕЛОВЕЧЕСКОЕ И АЛЬТЕРНАТИВНОЕ, они на самом деле уже происходят из такой таблицы), но я попробую переосмыслить это, спасибо – user1193694

+0

Разочарован. Я думал, что вы создаете игру Star Trek :( –