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

时间:2012-02-07 02:57:00

标签: mysql foreign-keys innodb cascade cascading-deletes

我对外键和CASCADE操作很新,我想知道以下情况:

假设我有两个完全不同的父表(HUMAN和ALIEN),数据完全不同。现在,我想要做的是创建一个名为SPACESHIP的子表,因为人类和外星人都可以拥有宇宙飞船,FK指向HUMAN中的一行或ALIEN中的一行,希望如果我删除人行或外星人行,它将Cascade删除相应父母所拥有的相应太空船行。使用FK和CASCADE DELETE有一个很好的方法吗?或者我应该在HUMAN和ALIEN中有一个名为spaceship_id的列并手动/通过触发器处理太空船的删除?其他一些行动方案?

帮助!

2 个答案:

答案 0 :(得分:2)

这可以通过添加一个超类型表(我们称之为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 ;

答案 1 :(得分:0)

如果使用InnoDB存储引擎,则可以使用外键,因为目前只有InnoDB支持它们。否则,您可以使用triggers或使用一个查询删除父记录和子记录,例如:

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