问题描述
我有三个带有外键的表,但是当我运行此表时,它们应该在删除时级联
"DELETE FROM Tagmap WHERE excerptID = ?"
仅Tagmap
中的映射,Excerpt
和Tag
中均不发生任何变化。我在做什么错了?
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 表(此处为tag
或excerpt
)中删除,然后子记录将自动删除。如果您考虑一下,反之则不安全,因为可能有多个孩子引用同一个父母。
因此,您通常会运行以下查询:
DELETE FROM excerpt WHERE excerptID = ?
外键约束的on delete cascade
选项将自动删除tagmap
中带有相应excerptID
的所有记录。