【问题标题】:MySQL status update trigger on delete删除时 MySQL 状态更新触发器
【发布时间】:2011-10-24 14:53:48
【问题描述】:

我想看看你对这个问题的看法。

我在我的项目中使用 MySQL 数据库,并且在几乎每个表中,我都定义了一个名为 Status 的列(ENUM('active','inactive','deleted'))。

我这样做是出于性能原因,所以每当不需要(删除)一行时,我将其设置为“已删除”,而不是实际从数据库中删除它。这已被证明相当不错。

但是,现在我总是必须在我的项目中编写 PHP 函数来将行从 Active 更新为 Deleted。

您认为如何使用 MySQL 触发器或其他技术解决此问题?

谢谢

【问题讨论】:

    标签: php mysql codeigniter activerecord


    【解决方案1】:

    更新行以将其设置为已删除有什么问题?

    毕竟,

    UPDATE projects SET status = 'deleted' WHERE id = :id;
    

    DELETE FROM projects WHERE id = :id;
    

    没有太大的区别,还是有的?

    【讨论】:

      【解决方案2】:

      相信写出来的差别不大;

      DELETE FROM table WHERE id = 1
      

      UPDATE table SET status = 'deleted' WHERE id = 1
      

      只要您在所有表中创建具有相同名称的相同字段,触发函数对我来说似乎就没有必要了。

      【讨论】:

      • 对不起,我不小心编辑了你的答案,而不是我的。刚把它滚回来。很高兴看到,我们的答案几乎相同。因此,我没有注意到:)。
      【解决方案3】:

      您始终必须从应用程序代码向数据库发出请求,以实现您的应用程序用例。这是针对一行的实际 DELETE 语句,还是将状态设置为“已删除”的 UPDATE 语句并不重要。您无法通过某种触发器来规避这一点。

      【讨论】:

        【解决方案4】:

        这取决于你想要达到的目标..

        如果您在删除该行后不再需要该行,那么您应该删除它 - 更新状态列对您来说并没有多大作用。在性能方面,如果您物理删除该行可能会更好(当然,取决于数据库的实际结构)..

        如果您确实需要在删除记录后保留它,那么您可以创建一个存档表,当您从主表中删除记录时,您可以在其中写入记录的副本。副本将由 on-delete 触发器写入..

        无论哪种方式,您都必须进行数据库调用,要么删除记录,要么将状态更新为已删除..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-13
          • 1970-01-01
          • 2012-05-22
          • 2012-07-31
          • 2012-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多