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

标签 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)

我一辈子都弄不明白为什么这行不通。我在这里查看了类似的问题和答案,我完全按照他们所说的去做,但仍然没有用。大部分只是说改成ENGINE=InnoDb,我试了一下,没有成功。

这里一定有我遗漏的东西,而且可能非常明显.. 星期一早上。

如果有人能阐明我的这个小菜鸟问题,我将不胜感激!

编辑:从 foo2 中的 id 中删除了 auto_increment,因为它不属于那里

最佳答案

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

SHOW VARIABLES LIKE 'foreign_key_checks'

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

SET foreign_key_checks = 1;

注意:这只会影响当前 session 。新 session 继承全局设置。


此外,验证您的表是否确实使用了 InnoDB 引擎,并且外键已定义。最简单的方法是从以下位置获取输出:

SHOW CREATE TABLE foo;
SHOW CREATE TABLE foo2;

跟进

这是我们希望不会在 MySQL 5.1.61 中被破坏的东西。

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

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

关于mysql - 外键选项,ON DELETE CASCADE 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24245317/

相关文章:

mysql - 如何最佳地在 WHERE 子句中使用 COALESCE()?

php、MySQL、fpdf 和 $_Get?

mongodb - mongoDB安装错误

c# - 使用 C# 以编程方式将查询表从 MS Access 导出到 Excel

database - 删除级联不适用于 sqlite

java - DBCP XAMPP 不接受我的时区

php - 使用PHP更新MYSQL数据库

python - execute(sql) 后调用fetchall() 是不是第二次读取数据?

nhibernate - 当 cascade 是 delete-all-orphan 时,如何在 NHibernate 中更改 child 的 parent ?

grails - Grails:防止具有多个关系的两个域类之间的级联关联