与DELETE ALL和INSERT相比,UPDATE OR INSERT命令有技术优势吗?

时间:2013-07-31 21:43:51

标签: php mysql database innodb

公平地说,我已经看到了一些类似的问题herehere,但我相信这些问题主要是询问单行更新以及假设实际数据没有变化。

就我而言,我有一套销售代表可以提供的产品。这些整体产品由主表维护,用于定义它们:

master_table

ID  | Name  | status
---------------------
1   | prod1 |  1
2   | prod2 |  1
3   | prod3 |  0
4   | prod4 |  1

其中status表示活动(1)或非活动(0)。任何代表无法销售非活动产品,无论其在代表中的设置如何。

rep_table

ID |  repID  |  status
------------------------
1  |   rep1  |   1
2  |   rep1  |   1
3  |   rep1  |   1
1  |   rep2  |   0
2  |   rep2  |   1
3  |   rep3  |   0

此表中的状态为活动(1)或非活动(0)。同样,在确定销售代表可以提供哪些产品方面,主表的状态始终优先于rep_table状态。

我遇到的主要问题是我们为销售代表推出新产品。在代表管理门户中,他可以激活或停用他们希望提供的任何产品组。当用户选择(形成复选框)他/她希望销售的所有产品并点击时,提交一系列支票:

  1. 代表是否选择了一组产品?
  2. 是否以正确的格式选择了产品?
  3. 所选产品的列表是否与他们登录时已设置的产品列表不同(如果没有,警告不会发生更新)?
  4. 表格中选择的所有产品是否存在,并在master_table中设置为“有效”?
  5. 此时,逻辑然后为所选的每个产品切换(当前)以下内容:

    1. 将rep_table中的所有产品更新为非活动状态(针对该特定代表)
    2. 如果产品在登录时存在于当前产品集中,并且当前状态设置为非活动状态,则将该产品ID排队为活动状态。
    3. 如果在登录时当前产品集中不存在所通过的产品,请将新产品插入rep_table并设置为活动状态。
    4. 在“更新”声明开始时将特定代表的所有产品更新为非活动状态的主要原因是由于发现在登录时设置为“活动”的哪些产品更改为'的复杂性在产品选择表上不活跃。

      我想知道如果不是试图弄清楚当前产品选择的状态相对于登录时的代理的状态,那么首先在rep_table中删除特定repID的所有产品ID并不是更容易一次插入所有内容。我知道在这种情况下我运行了2个查询,但在我在同一命令中有更新和插入的情况下,我每次都运行至少2个以上的查询。

      以这种方式删除和插入会产生“技术性”影响吗?

      注意:我的表是InnoDB,我正在运行MySQL

3 个答案:

答案 0 :(得分:2)

根据您的编制方式,删除和插入在技术上可能是您提高性能的最佳选择。尽管如此,如果你有很好的索引,那么使用索引的UPDATE或REPLACE语句不值得删除所有数据然后重新插入。

如果Delete语句通过,但在您发出插入之前,您的服务器重新启动apache并且内存被转储...看起来很远,但可能会发生。更多的用户,更多的更新,更有可能改变...你可以将DELETE和INSERT放在一个事务中,但现在你可能会锁定一个表 - 这也会达到性能。

答案 1 :(得分:1)

这通常是我在更新这样的选项时所做的事情。通常更容易启动事务,核对旧选项列表,然后插入用户选择的新选项。它可能是两个查询,但它们很容易查询。

另一种选择是手动构建“更改”列表 - 找出新内容,找出删除的内容,然后删除删除/插入新内容。这通常会带来更多的执行开销,只是为了完成同样的事情。而且你仍然会运行两个查询。

答案 2 :(得分:0)

从概念的角度来看,只是为了完成其他答案,UPDATE修改现有的行。 DELETE + INSERT将创建新行。

虽然起初相当理论,但这具有实际意义:

  • 例如,关于数据库的引用完整性(外键约束,级联)。
  • 这可能会导致不同的触发器被触发。
  • 最后DELETE + INSERT可能(并且可能)与同一行上的并发UPDATES冲突。