【问题标题】:Reverse of ON DELETE CASCADEON DELETE CASCADE 的反转
【发布时间】:2023-04-03 17:04:01
【问题描述】:

假设我有以下架构:

CREATE TABLE `users` (
  `id` int(10) unsigned auto_increment,
  `historyId` varchar(255),
  PRIMARY KEY  (`id`)
);

CREATE TABLE `histories` (
  `id` int(10) unsigned auto_increment,
  `history` TEXT,
  PRIMARY KEY  (`id`)
);

一个用户只有一个历史记录,不让历史记录指向用户的目的是许多其他表(此架构中未提及)也有历史记录。

让删除用户同时删除其历史记录的最简单方法是什么?

【问题讨论】:

    标签: mysql sql database database-design


    【解决方案1】:

    你可以像这样使用触发器:

    DELIMITER $$
    CREATE TRIGGER delete_user_history_on_delete_user
    AFTER DELETE ON `users`
    FOR EACH ROW
    BEGIN
    DELETE FROM `histories` WHERE id = old.historyId;
    END$$
    DELIMITER ;
    

    【讨论】:

    • MySQL 文档解释了这一切。这是link
    【解决方案2】:

    我认为您不能在这里使用外键级联删除,因为数据类型不匹配。您在一个表中有 VARCHAR(255),在另一个表中有 INT(10)。 (这是怎么回事?)

    我认为您将不得不使用触发器或存储过程,这两者都不完全令人满意。触发器理论上是最安全的,因为客户端代码无法绕过它们。 (客户端代码可以避免调用存储过程。)但是有APIs that don't activate MySQL triggers

    MySQL 触发器由 SQL 激活 仅陈述。他们不是 由表中所做的更改激活 不传输 SQL 的 API 对 MySQL 服务器的语句

    【讨论】:

      【解决方案3】:

      如果用户历史是 1-1 关系,您可以将约束放在用户表中,而不是在“历史”表中

      【讨论】:

      • -1。引用问题:the purpose of not having histories point to users is that many other tables (not mentioned in this schema) also have histories.
      猜你喜欢
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2015-01-27
      • 2019-07-12
      • 2016-09-28
      • 1970-01-01
      相关资源
      最近更新 更多