微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何正确地在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的所有记录。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。