【问题标题】:MySQL delete from table or update table column to mark it as deleted?MySQL 从表中删除或更新表列以将其标记为已删除?
【发布时间】:2012-03-18 06:34:08
【问题描述】:

问题详情。假设我们有一些 InnoDB 表,并且该表包含一些记录。 我的问题是:考虑到某种形式的操作日志记录,您将如何实现“删除”操作?我引用了“删除”,因为它有一些味道:

  1. 删除操作应使用DELETE FROM table_x WHERE...。这适用于外键约束。但是如何才能跟踪这一操作呢? (我的意思是某种形式的数据库日志记录操作)。如果将删除的记录插入辅助数据库或同一数据库上的不同表中会是一个好主意吗?
  2. 另一个想法是有一个列,比如valid,其可能值为 1(用于活动/有效)和 0(用于已删除记录)。 “删除”操作只会将此列上的值设置为 0,业务逻辑不再考虑它。通过保留所有记录,日志记录将在同一个数据库上完成。这种方法必须大量使用触发器来执行其他任务,例如根据外键更新另一个表中的记录。

如果您有其他方法,请随意添加完成此任务的方法。 另外,如果我们确定变体 1) 效果最好,是否可以在同一个事务中(从 java 代码开始)同时执行 DELETE FROM database1.tableINSERT into database2.table? (老实说,我没有尝试过,但我认为它不会起作用)。我只是不想最终从第一个数据库中删除行并从第二个数据库中丢失行。如果不可能,但仍然是 1) 最好的选择,通过从 table1 中删除记录并将它们插入到同一事务中的 table2 中,将数据从 table1“移动”到 table2 是一个好习惯?

请记住 MySQL 服务器内置检查可保持数据库完整性,并且在回答我的问题/提出解决方案时,该解决方案也必须解决日志记录问题。

【问题讨论】:

  • 我个人使用有效/已删除的列,如果以后需要的话,可以让你做一些“待处理”的行。
  • 我们在谈论什么样的数据?如果将数据移入存档,您的公司会从挖掘数据中受益吗?

标签: java mysql transactions foreign-keys innodb


【解决方案1】:

我更喜欢第一种方法,它可以帮助您参考完整性和...,您可以使用基表上的触发器来处理它,因此所有事情都发生在同一个事务中

【讨论】:

    【解决方案2】:

    一般来说,我认为从财政上消除记录绝不是一个好主意。

    像将记录标记为无效的“逻辑”消除将是最好的主意。 事实上,在“现实世界”中,大型和重要数据库的记录永远不会被删除。我更喜欢第二种方法,因为您可以跟踪所有数据库操作。

    【讨论】:

    • 感谢您的回复。我仍然不知道在这种情况下我将如何使用 ON UPDATE 限制语句,将有效列从 1 更改为 0。有什么想法吗?
    • 不容易回答你的问题,因为我不知道 db 结构。我认为将 RESTRICT 更改为 CASCADE 可能很有用,因为 isValidField 您的记录(例如 table1 中的记录)也会在 table2 中更改(如果存在)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多