簡體   English   中英

如何在mysql表的外鍵中正確地級聯刪除?

[英]How to cascade on delete in a foreign key of a mysql table correctly?

我有三個帶有外鍵的表,但是當我運行它時,它們應該在刪除時級聯

"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;

這不是外鍵的工作方式。 您從表中刪除(這里是tagexcerpt ),然后子記錄會自動刪除。 如果你考慮一下,反過來就不安全了,因為可能有多個孩子引用同一個父母。

因此,您通常會運行此查詢:

DELETE FROM excerpt WHERE excerptID = ?

並且外鍵約束的on delete cascade選項會自動刪除tagmap具有相應excerptID所有記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM