直接更新数据库中的值或删除 - 再次添加它们

时间:2008-12-07 06:16:18

标签: database

每当我们必须更新数据库时;我们先从表中删除值,然后添加最新值。这可以确保一切都正确更新。

这给系统增加了一点开销,但由于这个原因我们没有遇到任何性能问题。

这总是最好的事情吗?

6 个答案:

答案 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>

还要考虑对触发器和日志记录的影响。当您可以授予更新权限时,您必须授予插入和删除权限。

我确信有一个常规的编程范例,例如“当我想为变量赋值时,我总是将它设置为零......”但我担心它不会传达这种情况完全令人恐惧。