我的数据库中有 3 个表(还有更多,但还没有与这些表的连接)
- 带有列 id 的表“分子”
- 包含“id”和“molecule_id”列以及引用“molecule.id”的外键的表“descriptor”
- 包含“id”和“descriptor_id”列以及引用“descriptor.id”的外键的表“tDepDescriptor”
(每个表都有更多的列,但这些列都不是外键或类似的东西)
所有外键都指定了“on delete cascade”,所有 id 都是 unsigned int(5)。
现在,如果我尝试删除“molecule”中的条目,而“descriptor”和“tDepDescriptor”中有引用条目,则没有任何反应,就好像外键设置为“on update restrict”一样,不会出现错误. 如果我删除“描述符”中的一个条目,“tDepDescriptor”中的所有引用条目都会被删除。 如果我尝试删除“分子”中的一个条目,在“描述符”中有引用条目,但没有对“tDepDescriptor”中的那些“描述符”条目的引用条目,也会发生同样的情况。 所以“on delete cascade”适用于两个表,但是当涉及三个表时“级联”似乎并没有传递。
表格应该做的是: 当我想删除“分子”中的条目时,“描述符”中的所有引用条目都被删除。因此,“tDepDescriptor”中所有引用“descriptor”中已删除条目之一的条目也将被删除。
mysql服务器版本为5.1,引擎为InnoDB
希望有人能理解这个复杂的解释并帮助我。
//编辑: 发现了问题。 似乎是 phpMyAdmin 的问题,而不是数据库的问题。在 PMA 中单击删除不起作用,但手动编码查询却起作用,级联所有三个表。奇怪,但至少我知道我的表工作正常。
最佳答案
有 ON DELETE CASCADE 选项就足够了。看看这个例子:
创建和填充表格:
CREATE TABLE molecule (
id INT(11) NOT NULL,
PRIMARY KEY (id)
)
ENGINE = INNODB;
CREATE TABLE descriptor (
id INT(11) NOT NULL,
molecule_id INT(11) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT FK_descriptor_molecule_id FOREIGN KEY (molecule_id)
REFERENCES molecule(id) ON DELETE CASCADE ON UPDATE RESTRICT
)
ENGINE = INNODB;
CREATE TABLE tdepdescriptor (
id INT(11) NOT NULL,
descriptor_id INT(11) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT FK_tdepdescriptor_descriptor_id FOREIGN KEY (descriptor_id)
REFERENCES descriptor(id) ON DELETE CASCADE ON UPDATE RESTRICT
)
ENGINE = INNODB;
INSERT INTO molecule VALUES
(1),
(2),
(3);
INSERT INTO descriptor VALUES
(1, 1),
(2, 1),
(3, 2);
INSERT INTO tdepdescriptor VALUES
(1, 1),
(2, 2),
(3, 3);
删除一个分子及其所有描述符和所有tdepdescriptor:
DELETE FROM molecule WHERE id = 1;
SELECT * FROM molecule;
+----+
| id |
+----+
| 2 |
| 3 |
+----+
SELECT * FROM descriptor;
+----+-------------+
| id | molecule_id |
+----+-------------+
| 3 | 2 |
+----+-------------+
SELECT * FROM tdepdescriptor;
+----+---------------+
| id | descriptor_id |
+----+---------------+
| 3 | 3 |
+----+---------------+
关于跨 3 个表的 MySQL 外键 "ON DELETE CASCADE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8878453/