在 mysql 中为 ON DELETE CASCADE 使用外键和引用

Goo*_*bot 7 mysql foreign-key

我在想这两种创建外键的方法是一样的

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

ype*_*eᵀᴹ 7

这是 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)