我正在尝试对我正在处理的数据库使用 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/