我在想这两种创建外键的方法是一样的
CREATE TABLE child1 (
id int(11) not null auto_increment,
parent_id int(11) REFERENCES parent_table(parent_id) ON DELETE CASCADE,
PRIMARY KEY(id)
);
Run Code Online (Sandbox Code Playgroud)
和
CREATE TABLE child2 (
id int(11) not null auto_increment,
parent_id int(11),
PRIMARY KEY(id),
FOREIGN KEY(parent_id) REFERENCES parent_table(parent_id) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
但是当从父表中删除一条记录时,表中相应的记录child2
将被删除,而不是表中的记录child1
。
我哪里错了?REFERENCES
是不够的,我们需要写FOREIGN KEY
使用ON DELETE CASCADE
?
这是 MySQL 的“陷阱”。第一种方法不起作用。
来自 MySQL 文档,FOREIGN KEY
约束:
重要的:
... 下面 4 段...
此外,InnoDB不识别或支持“inline REFERENCES 规范”(在 SQL 标准中定义),其中引用被定义为列规范的一部分。InnoDB 仅在作为单独的 FOREIGN KEY 规范的一部分指定时才接受 REFERENCES 子句。对于其他存储引擎,MySQL Server 解析并忽略外键规范。
创建 2 个表(方式 1):
CREATE TABLE parent_table (
parent_id int(11) not null auto_increment,
PRIMARY KEY(parent_id)
);
CREATE TABLE child1 (
id int(11) not null auto_increment,
parent_id int(11) REFERENCES parent_table(parent_id) ON DELETE CASCADE,
PRIMARY KEY(id)
);
Run Code Online (Sandbox Code Playgroud)
让我们看看是什么child1
:
> SHOW CREATE TABLE child1 ;
delimiter $$
CREATE TABLE `child1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
Run Code Online (Sandbox Code Playgroud)
在哪里FOREIGN KEY
?......随风而去(并且没有警告)
创建表child2
(方式 2)工作正常:
CREATE TABLE child2 (
id int(11) not null auto_increment,
parent_id int(11),
PRIMARY KEY(id),
FOREIGN KEY(parent_id) REFERENCES parent_table(parent_id) ON DELETE CASCADE
);
> SHOW CREATE TABLE child2 ;
delimiter $$
CREATE TABLE `child2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT `child2_ibfk_1`
FOREIGN KEY (`parent_id`) REFERENCES `parent_table` (`parent_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4505 次 |
最近记录: |