从表或更新表列中删除MySQL以将其标记为已删除?

时间:2012-02-28 18:47:36

标签: java mysql transactions foreign-keys innodb

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

  1. 删除操作应使用DELETE FROM table_x WHERE...。这适用于外键约束。但是,如何才能跟踪此操作? (我的意思是某种形式的数据库记录操作)。如果删除的记录插入到辅助数据库中,或者同一数据库中的不同表是个好主意?
  2. 另一个想法是有一个列,假设valid可能的值为1(对于活动/有效)和0(对于已删除的记录)。 “删除”操作只会将此列上的值设置为0,业务逻辑不再考虑它。通过保留所有记录,将在同一数据库上完成日志记录。这种方法必须大量使用触发器来执行其他任务,例如根据外键更新其他表中的记录。
  3. 如果您有这些任务,请随意添加其他方法来完成此任务。 另外,如果我们确定变量1)效果最好,那么在同一事务中(从java代码开始)是否可以同时执行DELETE FROM database1.tableINSERT into database2.table? (老实说,我没试过这个,但我认为它不会起作用)。我只是不想从第一个数据库中删除已删除的行并从第二个数据库中丢失行。如果不可能,但仍然1)最佳选择,通过删除table1中的记录并将它们插入到同一事务中的table2中,将数据从table1“移动”到table2是一个好习惯吗?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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