我试图用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
,但我尝试过了,没有成功。
必须有我丢失的东西在这里,它可能是很明显..周一早晨。
如果任何人都可以在我的这个小菜鸟的问题提供一些线索,我将不胜感激!
编辑:在auto_increment
从id
删除foo2
因为它不属于那里
弹出想到的第一件事是检查foreign_key_checks
变量的设置。如果被设置为0(FALSE),那么外键约束没有得到执行。
SHOW VARIABLES LIKE 'foreign_key_checks'
要启用外键约束,设置变量为1
SET foreign_key_checks = 1;
注:此仅影响当前会话。新会话继承全局设置。
此外,验证你的表实际使用InnoDB引擎,并且该外键定义。最简单的方法是从得到的输出:
SHOW CREATE TABLE foo;
SHOW CREATE TABLE foo2;
跟进
这是我们没有想到在MySQL 61年5月1日被打破的东西。
作为一种变通方法,尝试定义外键约束作为一个单独的ALTER TABLE语句。
ALTER TABLE foo2
ADD CONSTRAINT fk_foo2_id FOREIGN KEY (id) REFERENCES foo(id) ON DELETE CASCADE ;
我没有看到,都与“AUTO_INCREMENT”定义的两列之间的一个外键约束多大用处。在你的榜样,您可以轻松创建表“foo”的几行(没有“foo2的”配对),从那时候起,你无法控制两个表中的“ID”值是否匹配。
我承认我没有检查的文件,但是如果MySQL默默忽略自动生成的列外键约束它不会让我感到吃惊。
IMNSHO,你的表“foo2的”应该使用哪种明确设置“身份证”的价值观和参考特定行中的“富”,因为那将使意义,删除这样的“foo”的行应级联到“foo2的”。