具有多个父项的表的外键CASCADE DELETE?

问题描述:

我很新的外键和CASCADE操作,而且我想知道以下情况:具有多个父项的表的外键CASCADE DELETE?

比方说,我有完全不同的数据完全不同的两个父表(人力和ALIEN)。现在,我想要做的是创建一个名为SPACESHIP的子表,因为人类和外星人都可以拥有太空船,FK可以指向HUMAN中的一行或ALIEN中的一行,希望如果我删除人类行或外来行,它会级联删除相应父级拥有的对应太空船行。有没有用FK和CASCADE DELETE做这件事的好方法?还是应该只在HUMAN和ALIEN中有一个名为spaceship_id的列,并手动/通过触发器来处理删除太空船的问题?其他一些行动?

帮助!

如果您使用InnoDB存储引擎,那么您可以使用外键,因为目前只有InnoDB支持它们。否则,你可以使用triggers或删除使用一个查询:家长和孩子的记录,e.g

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

这可以通过添加一个超表来解决(让我们称之为它Being),有作为亚型两个HumanAlien表。然后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

感谢,我以前做过这样的事情;我不知道在我目前的项目中是否可以使用这个策略(例子并不完全是HUMAN和ALIEN,它们实际上已经是从这样的一张桌子下来的),但我会尝试重新考虑这一点,谢谢 – user1193694 2012-02-07 17:32:57

+0

失望。我以为你正在创造一些星际迷航游戏:( – 2012-02-07 23:46:31