每当我们必须更新数据库时;我们先从表中删除值,然后添加最新值。这可以确保一切都正确更新。
这给系统增加了一点开销,但由于这个原因我们没有遇到任何性能问题。
这总是最好的事情吗?
答案 0 :(得分:3)
没有
使用UPDATE语句。
此外,如果您担心完整性,请在交易中将其范围包括在内:
BEGIN TRAN T1
-- This update is part of T1
UPDATE Table1 SET Col1='New Value' WHERE Col2 = @Id;
-- Time to commit your changes.
-- If for any reason something fails,
-- everything gets rolled back
COMMIT TRAN T1
答案 1 :(得分:2)
没有
如果表已编入索引(大多数是)但您不正在运行常规索引维护任务以重建(碎片整理)索引,则更新将更可取。删除和重新创建行将导致碎片化。
答案 2 :(得分:1)
如果一切都不正确更新怎么办?
答案 3 :(得分:0)
通过“数据库”,我认为你的意思是一个SQL数据库。做delete
然后insert
的危险是,除非您对交易小心,否则它是非原子的。在删除行和插入新行之间的时间内,有人可能会在类似的行中滑动导致insert
在某些约束上失败。正如J. Holland指出的那样,这也是一种浪费,因为有update
。这一切都是一次性完成的。将更新单独放在自己的事务中可能是不必要的,因为更新是原子的。
如果您正在执行delete-then-insert,因为您不确定该行是否已存在,则某些数据库会生成replace
语句,如果没有行则会插入,如果存在则会更新。< / p>
答案 4 :(得分:0)
正如其他人所说,使用UPDATE。
另外一个原因:如果在任何参照完整性约束上有CASCADE DELETE,则DELETE然后INSERT丢失从属数据。如果您没有CASCADE DELETE,则可能无法删除该记录,因为它仍然被其他表引用。
答案 5 :(得分:-1)
删除插入是一种比更新更高成本的操作。
如果原因不明显,那是因为您必须存储要删除的完整行的撤消/重做信息,包括修改所有索引条目并检查由删除引起的参照完整性违规,然后插入具有所有撤消/重做,索引条目,完整性检查等的新行。新行也可能位于与删除不同的块中,因此现在您将(至少)物理i / o要求加倍。 / p>
还要考虑对触发器和日志记录的影响。当您可以授予更新权限时,您必须授予插入和删除权限。
我确信有一个常规的编程范例,例如“当我想为变量赋值时,我总是将它设置为零......”但我担心它不会传达这种情况完全令人恐惧。