首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否对具有多个父级的表执行外键级联删除?

是否对具有多个父级的表执行外键级联删除?
EN

Stack Overflow用户
提问于 2012-02-07 10:57:00
回答 2查看 3.1K关注 0票数 1

我对外键和级联操作非常陌生,我想知道下面的场景:

假设我有两个完全不同的父表(人类和外星人),它们的数据完全不同。现在,我要做的是创建一个子表,命名为宇宙飞船,因为人类和外星人都可以拥有宇宙飞船,FK将指向人类或外星人的行,希望如果我删除人类行或外星人行,它将级联删除各自父级拥有的相应宇宙飞船行。有没有一个很好的方法可以用FK和级联删除来完成这项工作?或者我应该只在人类和外星人中有一个名为spaceship_id的列,并手动/通过触发器处理删除太空船的操作?还有其他的行动方案吗?

帮助!

EN

回答 2

Stack Overflow用户

发布于 2012-02-07 16:41:03

这可以通过添加一个超类型表(让我们称其为Being)来解决,该表具有两个HumanAlien表作为子类型。那么FOREIGN KEY约束将引用这个超类型表。

超类型:

代码语言:javascript
复制
CREATE TABLE Being
( BeingId  INT AUTO_INCREMENT
, ... other stuff about beings
, PRIMARY KEY (BeingId)
) ENGINE = InnoDB ;

子类型:

代码语言:javascript
复制
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表:

代码语言:javascript
复制
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 ;
票数 2
EN

Stack Overflow用户

发布于 2012-02-07 14:51:09

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

代码语言:javascript
复制
DELETE HUMAN, SPACESHIP
 FROM HUMAN
 JOIN SPACESHIP
   ON HUMAN.id = SPACESHIP.id
WHERE HUMAN.id = 1; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9170411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档