【问题标题】:Updating intersection tables, alternative to delete->insert更新交集表,替代删除->插入
【发布时间】:2011-02-23 16:14:20
【问题描述】:

我希望再有一些 SQL 明智的人可以帮助我。假设下面的表和它们的关系被压缩了。

orders(PK_refno,customer, status) order_accessories(PK_refno,PK_acc) accessories(PK_acc,name,desc)

如您所见,这是一个典型的1:*----*:*----*:1 场景,问题或我担心的是更新时,因为每个订单的附件都可以修改,这意味着用户可以添加/删除附件。

我认为使用 MySQL 的唯一方法是删除所有附件,然后插入更新的附件。

我不喜欢这种方式。我认为可能有一种 SQL 方式可以做到这一点。也许有人可以提出建议和高级查询(我当然会研究)

我想的另一种方法是:

  • 检索原件。
  • 比较它们并删除/添加差异。

    我也不喜欢这个,因为它会在应用程序中完成,而不是在数据库中。

  • 【问题讨论】:

      标签: mysql sql database intersection


      【解决方案1】:

      假设表格是这样开始的。

      order_accessories
      PK_refno  PK_acc
      1         73
      1         74
      1         75
      1         86
      1         92
      

      假设 75 应该是 76。假设用户界面正常,用户只需将 75 更改为 76。正常的用户界面会将这条语句发送到 dbms。

      update order_accessories
      set PK_acc = 76
      where (PK_refno = 1 and PK_acc = 75);
      

      如果一开始就不应该有 75,那么用户只会删除那一行。一个健全的用户界面会将此语句发送到 dbms。

      delete from order_accessories
      where (PK_refno = 1 and PK_acc = 75);
      

      【讨论】:

      • 但是不更新条件将要更改的记录(PK_acc = 75 到 PK_acc =76)会导致问题吗?
      • @Triztian:它不会在数据库级别造成任何问题。如果您的 UI 程序员不称职,它可能会在用户界面级别造成问题。
      【解决方案2】:

      我只想补充一点,我首先删除了所有与更新顺序匹配的记录,然后重新插入新记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-27
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 2015-04-26
        相关资源
        最近更新 更多