我正在尝试将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
,因为它不属于那里
答案 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;。