跨 3 个表的 MySQL 外键 "ON DELETE CASCADE"

标签 mysql foreign-keys

我的数据库中有 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/

相关文章:

Java Spring jdbcTemplate queryForList 慢

mysql - mysql 查询中烦人的 IF/THEN 语句

php - 根据 GMT 转换日期和时间

php - 如何通过将一个表中的 ID 与另一个表匹配来选择和更新一个表中的记录?

mysql - mysql中外键为主键

mysql - 如何从mysql表中删除记录,但跳过有约束错误的记录?

php - 如何使用 Symfony2、Doctrine2 执行存储过程

mysql - 多个外键引用一列给我错误

sql - 如何使用非唯一外键强制数据库完整性?

java - 使用 JDBC 获取所有外键