【问题标题】:MySQL foreign key cascade delete not working, completely stumpedMySQL外键级联删除不起作用,完全难倒
【发布时间】:2013-08-07 19:51:29
【问题描述】:

我已经阅读了很多关于此的其他主题,但我仍然很难过。我创建了两个非常简单的表作为完整性检查,但无法让它们执行级联删除,因此此时需要一些帮助。

CREATE TABLE `test1` (
  `test1_ID` int(11) NOT NULL AUTO_INCREMENT,
  `test1_name` char(15) DEFAULT NULL,
  PRIMARY KEY (`test1_ID`),
  UNIQUE KEY `test1_ID_UNIQUE` (`test1_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `test2` (
  `test2_ID` int(11) NOT NULL AUTO_INCREMENT,
  `test2_FK_test1` int(11) NOT NULL,
  `test2_name` char(15) DEFAULT NULL,
  PRIMARY KEY (`test2_ID`),
  UNIQUE KEY `test2_ID_UNIQUE` (`test2_ID`),
  KEY `IDX_test2_FK_test1` (`test2_FK_test1`),
  CONSTRAINT `FK_test2__test1` FOREIGN KEY (`test2_FK_test1`) REFERENCES `test1` (`test1_ID`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

用于测试的表格数据

Test 1 Table Data:
+----------+------------+
| test1_ID | test1_name |
+----------+------------+
|        1 | test1 r1   |
|        2 | test1 r2   |
+----------+------------+

Test 2 Table Data:
+----------+----------------+----------------+
| test2_ID | test2_FK_test1 | test2_name     |
+----------+----------------+----------------+
|        1 |              1 | Test2 R1 - FK1 |
|        2 |              1 | Test2 R2 - FK1 |
|        3 |              1 | Test2 R3 - FK1 |
+----------+----------------+----------------+

Insert statements:
INSERT INTO `test1` VALUES (1,'test1 r2'),(2,'test1 r2');
INSERT INTO `test2` VALUES (1,1,'Test2 R1 - FK1'),(2,1,'Test2 R2 - FK1'),(3,1,'Test2 R3 - FK1');

如果我从 test1 表中删除第一行,那么 test2 表数据不会发生任何变化

DELETE FROM test1 WHERE test1_ID = 1;

【问题讨论】:

  • 很奇怪。 This is supposed to work...(题外话:您的 UNIQUE 约束是多余的,PRIMARY KEY 已经是唯一约束)
  • 我刚刚完全按照上面的方法测试了您的 SQL,它运行良好。从 test1 中删除行时,从 test2 中删除了三行。
  • 这可能是我运行 5.5.28 的 MySQL 版本的错误,我会更新它,看看会发生什么。

标签: mysql foreign-keys constraints cascade


【解决方案1】:

原来是我使用的 MySQL 版本 5.5.28 中的一个错误。我刚刚升级到 5.6.13,现在一切正常。感谢您的帮助。

【讨论】:

  • 准备发布 MySQL 的过程未能识别出此类问题,这有点令人不安。
【解决方案2】:

确保启用了mysql“外键检查”:

select @@FOREIGN_KEY_CHECKS;

set FOREIGN_KEY_CHECKS=1;

【讨论】:

    【解决方案3】:

    我发现调用PDO::exec('SET FOREIGN_KEY_CHECKS=1') 是PDO 尊重ON DELETEON UPDATE 操作所必需的。由于某种原因,我的系统默认禁用外键约束。

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2013-03-03
      相关资源
      最近更新 更多