公平地说,我已经看到了一些类似的问题here和here,但我相信这些问题主要是询问单行更新以及假设实际数据没有变化。
就我而言,我有一套销售代表可以提供的产品。这些整体产品由主表维护,用于定义它们:
ID | Name | status
---------------------
1 | prod1 | 1
2 | prod2 | 1
3 | prod3 | 0
4 | prod4 | 1
其中status表示活动(1)或非活动(0)。任何代表无法销售非活动产品,无论其在代表中的设置如何。
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状态。
我遇到的主要问题是我们为销售代表推出新产品。在代表管理门户中,他可以激活或停用他们希望提供的任何产品组。当用户选择(形成复选框)他/她希望销售的所有产品并点击时,提交一系列支票:
此时,逻辑然后为所选的每个产品切换(当前)以下内容:
在“更新”声明开始时将特定代表的所有产品更新为非活动状态的主要原因是由于发现在登录时设置为“活动”的哪些产品更改为'的复杂性在产品选择表上不活跃。
我想知道如果不是试图弄清楚当前产品选择的状态相对于登录时的代理的状态,那么首先在rep_table中删除特定repID的所有产品ID并不是更容易一次插入所有内容。我知道在这种情况下我运行了2个查询,但在我在同一命令中有更新和插入的情况下,我每次都运行至少2个以上的查询。
以这种方式删除和插入会产生“技术性”影响吗?
注意:我的表是InnoDB,我正在运行MySQL
答案 0 :(得分:2)
根据您的编制方式,删除和插入在技术上可能是您提高性能的最佳选择。尽管如此,如果你有很好的索引,那么使用索引的UPDATE或REPLACE语句不值得删除所有数据然后重新插入。
如果Delete语句通过,但在您发出插入之前,您的服务器重新启动apache并且内存被转储...看起来很远,但可能会发生。更多的用户,更多的更新,更有可能改变...你可以将DELETE和INSERT放在一个事务中,但现在你可能会锁定一个表 - 这也会达到性能。
答案 1 :(得分:1)
这通常是我在更新这样的选项时所做的事情。通常更容易启动事务,核对旧选项列表,然后插入用户选择的新选项。它可能是两个查询,但它们很容易查询。
另一种选择是手动构建“更改”列表 - 找出新内容,找出删除的内容,然后删除删除/插入新内容。这通常会带来更多的执行开销,只是为了完成同样的事情。而且你仍然会运行两个查询。
答案 2 :(得分:0)
从概念的角度来看,只是为了完成其他答案,UPDATE
修改现有的行。 DELETE
+ INSERT
将创建新行。
虽然起初相当理论,但这具有实际意义:
DELETE
+ INSERT
可能(并且可能)与同一行上的并发UPDATES
冲突。