具有多个父项的表的外键CASCADE DELETE?
问题描述:
我很新的外键和CASCADE操作,而且我想知道以下情况:具有多个父项的表的外键CASCADE DELETE?
比方说,我有完全不同的数据完全不同的两个父表(人力和ALIEN)。现在,我想要做的是创建一个名为SPACESHIP的子表,因为人类和外星人都可以拥有太空船,FK可以指向HUMAN中的一行或ALIEN中的一行,希望如果我删除人类行或外来行,它会级联删除相应父级拥有的对应太空船行。有没有用FK和CASCADE DELETE做这件事的好方法?还是应该只在HUMAN和ALIEN中有一个名为spaceship_id
的列,并手动/通过触发器来处理删除太空船的问题?其他一些行动?
帮助!
答
这可以通过添加一个超表来解决(让我们称之为它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 ;
感谢,我以前做过这样的事情;我不知道在我目前的项目中是否可以使用这个策略(例子并不完全是HUMAN和ALIEN,它们实际上已经是从这样的一张桌子下来的),但我会尝试重新考虑这一点,谢谢 – user1193694 2012-02-07 17:32:57
失望。我以为你正在创造一些星际迷航游戏:( – 2012-02-07 23:46:31