Как правильно каскадировать удаление во внешнем ключе таблицы mysql?

#mysql #sql #foreign-keys #sql-delete #create-table

#mysql #sql #внешние ключи #sql-удалить #create-table

Вопрос:

У меня есть три таблицы с внешними ключами, которые, тем не менее, должны каскадироваться при удалении, когда я запускаю это

 "DELETE FROM Tagmap WHERE excerptID = ?"
  

только отображение в Tagmap и ничего не происходит в Excerpt nor 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;
  

Ответ №1:

Внешние ключи работают не так. Вы удаляете из родительской таблицы (здесь , tag , или excerpt ), а затем дочерние записи автоматически удаляются. Если вы подумаете об этом, другой способ не будет безопасным, поскольку может быть несколько дочерних элементов, ссылающихся на одного и того же родителя.

Итак, вы обычно выполняете этот запрос:

 DELETE FROM excerpt WHERE excerptID = ?
  

И on delete cascade опция ограничения внешнего ключа автоматически удалит все записи в tagmap с соответствующим excerptID .