302*_*aya 1 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)
Run Code Online (Sandbox Code Playgroud)
我不能为我的生活弄清楚为什么这不起作用.我在这里查看了类似的问题和答案,我完全按照他们的说法做了,但仍然无效.他们中的大多数人只是说改变了ENGINE=InnoDb,但我尝试过但没有成功.
我必须在这里找到一些东西,这可能非常明显......星期一早上.
如果有人能对我的这个小菜鸟问题有所了解,我将不胜感激!
编辑:删除auto_increment来自id于foo2,因为它不属于那里
首先想到的是检查foreign_key_checks变量的设置.如果将其设置为0(FALSE),则不强制执行外键约束.
SHOW VARIABLES LIKE 'foreign_key_checks'
Run Code Online (Sandbox Code Playgroud)
要启用foeign键约束,请将变量设置为1
SET foreign_key_checks = 1;
Run Code Online (Sandbox Code Playgroud)
注意:这仅影响当前会话.新会话继承GLOBAL设置.
此外,验证您的表实际上是否正在使用InnoDB引擎,并且已定义外键.最简单的方法是从以下输出:
SHOW CREATE TABLE foo;
SHOW CREATE TABLE foo2;
Run Code Online (Sandbox Code Playgroud)
跟进
这是我们期望在MySQL 5.1.61中不被破坏的东西.
作为解决方法,尝试将外键约束定义为单独的ALTER TABLE语句.
ALTER TABLE foo2
ADD CONSTRAINT fk_foo2_id FOREIGN KEY (id) REFERENCES foo(id) ON DELETE CASCADE ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1818 次 |
| 最近记录: |