的外键选项ON DELETE CASCADE不工作?

问题描述 投票:1回答:2

我试图用ON DELETE CASCADE对我工作的数据库。似乎没有工作,所以我测试了它在没有成功一个简单的例子。

CREATE TABLE foo (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
data VARCHAR(10),
PRIMARY KEY (id)
)ENGINE=InnoDB;

CREATE TABLE foo2 (
id INT UNSIGNED NOT NULL,
data2 VARCHAR(10),
PRIMARY KEY (id),
CONSTRAINT fk_foo2_id FOREIGN KEY (id) REFERENCES foo(id) ON DELETE CASCADE
)ENGINE=InnoDB;

INSERT INTO foo (data) VALUE ('hello'),('world'),('mysql');
INSERT INTO foo2 (data2) VALUE ('hello2'),('world2'),('mysql2');

SELECT * FROM foo;

+----+-------+
| id | data  |
+----+-------+
|  1 | hello |
|  2 | world |
|  3 | mysql |
+----+-------+
3 rows in set (0.00 sec)

SELECT * FROM foo2;

+----+--------+
| id | data2  |
+----+--------+
|  1 | hello2 |
|  2 | world2 |
|  3 | mysql2 |
+----+--------+
3 rows in set (0.00 sec)

DELETE FROM foo WHERE id=2;

SELECT * FROM foo;
+----+-------+
| id | data  |
+----+-------+
|  1 | hello |
|  3 | mysql |
+----+-------+
2 rows in set (0.00 sec)

SELECT * FROM foo2;

+----+--------+
| id | data2  |
+----+--------+
|  1 | hello2 |
|  2 | world2 |
|  3 | mysql2 |
+----+--------+
3 rows in set (0.00 sec)

我不能为我的生命弄清楚为什么这是行不通的。我看着相似的问题和答案在这里,我做了什么,他们说,它仍然没有工作。他们中的大多数只是说要改变ENGINE=InnoDb,但我尝试过了,没有成功。

必须有我丢失的东西在这里,它可能是很明显..周一早晨。

如果任何人都可以在我的这个小菜鸟的问题提供一些线索,我将不胜感激!

编辑:在auto_incrementid删除foo2因为它不属于那里

mysql database cascade
2个回答
6
投票

弹出想到的第一件事是检查foreign_key_checks变量的设置。如果被设置为0(FALSE),那么外键约束没有得到执行。

SHOW VARIABLES LIKE 'foreign_key_checks'

要启用外键约束,设置变量为1

SET foreign_key_checks = 1;

注:此仅影响当前会话。新会话继承全局设置。


此外,验证你的表实际使用InnoDB引擎,并且该外键定义。最简单的方法是从得到的输出:

SHOW CREATE TABLE foo;
SHOW CREATE TABLE foo2;

跟进

这是我们没有想到在MySQL 61年5月1日被打破的东西。

作为一种变通方法,尝试定义外键约束作为一个单独的ALTER TABLE语句。

ALTER TABLE foo2 
ADD CONSTRAINT fk_foo2_id FOREIGN KEY (id) REFERENCES foo(id) ON DELETE CASCADE ;

2
投票

我没有看到,都与“AUTO_INCREMENT”定义的两列之间的一个外键约束多大用处。在你的榜样,您可以轻松创建表“foo”的几行(没有“foo2的”配对),从那时候起,你无法控制两个表中的“ID”值是否匹配。

我承认我没有检查的文件,但是如果MySQL默默忽略自动生成的列外键约束它不会让我感到吃惊。

IMNSHO,你的表“foo2的”应该使用哪种明确设置“身份证”的价值观和参考特定行中的“富”,因为那将使意义,删除这样的“foo”的行应级联到“foo2的”。

© www.soinside.com 2019 - 2024. All rights reserved.