如何正确地在mysql表的外键中级联删除?

问题描述

我有三个带有外键的表,但是当我运行此表时,它们应该在删除时级联

"DELETE FROM Tagmap WHERE excerptID = ?"

Tagmap中的映射,ExcerptTag中均不发生任何变化。我在做什么错了?

CREATE TABLE IF NOT EXISTS excerpt(
  excerptID INT UNSIGNED NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,text VARCHAR(2500) NOT NULL,comments VARCHAR(2500) NOT NULL,PRIMARY KEY (excerptID)
) ENGINE=INNODB CHaraCTER SET utf8mb4;

CREATE TABLE IF NOT EXISTS tag(
  tagID INT UNSIGNED NOT NULL AUTO_INCREMENT,description VARCHAR(255) NOT NULL,PRIMARY KEY (tagID)
) ENGINE=INNODB CHaraCTER SET utf8mb4;

CREATE TABLE IF NOT EXISTS tagmap (
  excerptID INT UNSIGNED NOT NULL,tagID INT UNSIGNED NOT NULL,PRIMARY KEY (excerptID,tagID),CONSTRAINT excerptFK FOREIGN KEY (excerptID) REFERENCES excerpt (excerptID)
    ON DELETE CASCADE 
    ON UPDATE CASCADE,CONSTRAINT tagFK FOREIGN KEY (tagID) REFERENCES tag (tagID)
    ON DELETE CASCADE 
    ON UPDATE CASCADE
) ENGINE=INNODB;

解决方法

这不是外键的工作方式。您从 parent 表(此处为tagexcerpt)中删除,然后子记录将自动删除。如果您考虑一下,反之则不安全,因为可能有多个孩子引用同一个父母。

因此,您通常会运行以下查询:

DELETE FROM excerpt WHERE excerptID = ?

外键约束的on delete cascade选项将自动删除tagmap中带有相应excerptID的所有记录。