我对外键和级联操作非常陌生,想知道以下场景:
假设我有两个完全不同的父表(HUMAN和ALIEN),其中包含完全不同的数据。现在,我要做的是创建一个名为SPACESHIP的子表,因为人类和外星人都可以拥有太空船,FK将指向人类中的一行或外星人中的一行,希望如果我删除人类行或外星人行,它将级联删除各自父级拥有的相应太空船行。有没有一个很好的方法来处理FK和层叠删除?或者我应该在HUMAN and ALIEN中有一个名为spaceship_id的列,并手动/通过触发器处理太空船的删除?其他的行动方案?
救命啊!

最佳答案

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

关于mysql - 多父表的外键CASCADE DELETE?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9170411/

10-16 15:40