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

时间:2014-06-16 13:49:44

标签: 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,但我尝试过但没有成功。

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

如果有人能够解释我的这个小小的noob问题,我将非常感激!

修改:从auto_increment id移除了foo2,因为它不属于那里

2 个答案:

答案 0 :(得分:6)

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

SHOW VARIABLES LIKE 'foreign_key_checks'

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

SET foreign_key_checks = 1;

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


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

SHOW CREATE TABLE foo;
SHOW CREATE TABLE foo2;

<强>后续

我们希望在MySQL 5.1.61中打破 NOT

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

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

答案 1 :(得分:2)

我没有在两个列之间的外键约束中看到很多用法,这两个列都用&#34; auto_increment&#34;定义。在您的示例中,您可以轻松地在表格中创建多个行&#34; foo&#34; (没有&#34; foo2&#34;)中的对应物,从那时起你就无法控制是否&#34; id&#34;两个表中的值匹配。

我承认我没有查看文档,但如果MySQL默默地忽略了自动生成列的外键约束,那就不会让我感到惊讶。

IMNSHO,你的桌子&#34; foo2&#34;应该使用&#34; id&#34;显式设置的值和&#34; foo&#34;中的引用特定行,因为那样删除这样的&#34; foo&#34;行应该级联到&#34; foo2&#34;。