外键选项,ON DELETE CASCADE不起作用?

302*_*aya 1 mysql database cascade

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

我不能为我的生活弄清楚为什么这不起作用.我在这里查看了类似的问题和答案,我完全按照他们的说法做了,但仍然无效.他们中的大多数人只是说改变了ENGINE=InnoDb,但我尝试过但没有成功.

我必须在这里找到一些东西,这可能非常明显......星期一早上.

如果有人能对我的这个小菜鸟问题有所了解,我将不胜感激!

编辑:删除auto_increment来自idfoo2,因为它不属于那里

spe*_*593 6

首先想到的是检查foreign_key_checks变量的设置.如果将其设置为0(FALSE),则不强制执行外键约束.

SHOW VARIABLES LIKE 'foreign_key_checks'
Run Code Online (Sandbox Code Playgroud)

要启用foeign键约束,请将变量设置为1

SET foreign_key_checks = 1;
Run Code Online (Sandbox Code Playgroud)

注意:这仅影响当前会话.新会话继承GLOBAL设置.


此外,验证您的表实际上是否正在使用InnoDB引擎,并且已定义外键.最简单的方法是从以下输出:

SHOW CREATE TABLE foo;
SHOW CREATE TABLE foo2;
Run Code Online (Sandbox Code Playgroud)

跟进

这是我们期望在MySQL 5.1.61中被破坏的东西.

作为解决方法,尝试将外键约束定义为单独的ALTER TABLE语句.

ALTER TABLE foo2 
ADD CONSTRAINT fk_foo2_id FOREIGN KEY (id) REFERENCES foo(id) ON DELETE CASCADE ;
Run Code Online (Sandbox Code Playgroud)