【问题标题】:How to delete all child records when parent record is deleted? [duplicate]删除父记录时如何删除所有子记录? [复制]
【发布时间】:2013-05-27 16:16:34
【问题描述】:

我有两张桌子,一张是 Floor。每个楼层都可以包含房间,这些房间包含位于 Floor 表中的 Floor_ID 的外键。我一直在阅读关于 ON CASCADE DELETE 的文章,这似乎是我的答案,但我对我所读到的内容感到困惑。我知道我可以调用一个包含两个命令的例程,

DELETE FROM Room WHERE Floor_ID = floorID;
DELETE FROM Floor WHERE Floor_ID = floorID;

但是我如何使用 ON CASCADE DELETE 来执行相同的操作?删除楼层后,与该楼层关联的所有房间也将被删除。

CREATE TABLE `Floor` (
`Floor_ID` int(11) NOT NULL AUTO_INCREMENT,
`Hub_ID` int(11) NOT NULL,
`FloorNum` int(11) NOT NULL,
`FloorName` varchar(45) DEFAULT NULL,
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`Hub_ID`,`FloorNum`),
UNIQUE KEY `Floor_ID_UNIQUE` (`Floor_ID`),
KEY `fk_Floor_Hub1_idx` (`Hub_ID`),
CONSTRAINT `fk_Floor_Hub1` FOREIGN KEY (`Hub_ID`) REFERENCES `Hub` (`Hub_ID`) ON DELETE   NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=124 DEFAULT CHARSET=latin1

CREATE TABLE `Room` (
`Room_ID` int(11) NOT NULL AUTO_INCREMENT,
`RoomLabel` varchar(45) NOT NULL,
`Floor_ID` int(11) NOT NULL,
`FloorArea` decimal(10,2) NOT NULL COMMENT 'Square feet',
`RoomHeight` decimal(10,2) DEFAULT NULL COMMENT 'Feet',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`Room_ID`),
KEY `fk_Room_Floor1_idx` (`Floor_ID`),
CONSTRAINT `fk_Room_Floor1` FOREIGN KEY (`Floor_ID`) REFERENCES `Floor` (`Floor_ID`) ON   DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=259 DEFAULT CHARSET=latin1

【问题讨论】:

标签: mysql sql cascade sql-delete


【解决方案1】:

您必须将外键约束定义为 ON DELETE CASCADE。目前,您将它们设置为 NO ACTION。当它们在 CASCADE 上时,所有引用已删除记录的记录也将被删除。

【讨论】:

  • 工作就像一个魅力。谢谢。
  • 我有一个问题。如果在删除楼层期间发生电源故障或类似情况,是否会执行回滚?
  • 通常情况下,您始终可以处理事务 (dev.mysql.com/doc/refman/5.0/en/commit.html)。我认为您必须将 SET 自动提交设置为 false 以使 COMMIT 有效完成操作所需的设置。否则,默认情况下会提交未提交的事务,即使您没有告诉数据库这样做......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2016-09-08
  • 2012-12-27
  • 2020-03-10
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多