【问题标题】:MySQL check before soft delete软删除前的 MySQL 检查
【发布时间】:2015-04-27 19:25:35
【问题描述】:

我正在使用 MySQL。我在A 表上有一个带有软删除列的记录:active,其值为0

此行链接到 11 个表。都有相同的active 列。

我需要确保删除A 上的记录只有在 11 个表中的所有引用也都具有active = 0 时。

我知道我可以用这些查询编写一个视图来获取是否可以“删除”。但这是一个例子,IMO 不是很实用的解决方案。级联更新也不起作用,因为如果任何子行仍处于活动状态,我无法删除父行。

谢谢!

【问题讨论】:

  • 你说:我需要确保A 上的记录被删除仅当 11 个表中的所有引用也都具有active = 0。删除是指硬删除还是软删除(set active = 0)
  • 这可能会变得一团糟,或许可以考虑使用 fk 来限制删除,这意味着您总是需要在删除父级之前删除子级。
  • @SteveMandl 是的。假设你有一个学生。如果他/她仍在课程中(Student_Courses 表上的活动 = 1),则无法删除(活动 = 0)。我需要为历史日志保留这两条记录。
  • @Augwa 谢谢,但如果不存在任何关系,该检查就可以了,但它不会检查我是否允许安全删除它。

标签: mysql foreign-keys constraints soft-delete


【解决方案1】:

如果您按照您所说的那样创建 active_view,这应该可以工作。只需将所有相关表的活动标志添加到 foreign_active 列中,就可以了。

CREATE TRIGGER before_update_student
 BEFORE UPDATE ON student  FOR EACH ROW
 BEGIN
      IF NEW.active = 0 AND (SELECT foreign_active FROM active_view
           WHERE id = NEW.id) > 0
      THEN
           SIGNAL SQLSTATE '45000'
                SET MESSAGE_TEXT = 'Cannot delete student when active roles exist.';
      END IF;
 END;

【讨论】:

  • 好的,所以如果我有 11 个表,我应该检查所有表,比方说,手动?是否有通用且更快的方法?
  • 在数据库中,可能没有更优雅的方式了。如果 mysql 在检查约束中支持子查询,您可以为每个相关表添加检查约束。我不认为这会更好。您可以在您的应用程序中强制执行此操作,然后您可以使用订阅/通知或对象继承来做一些聪明的事情。
  • 嗯我觉得这样做是错误的,但我所做的所有搜索都以这样的方式结束。我认为我越早开始写作越好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多