我必须识别行是否已更改并更新,如果是这样。在我的程序中,我有一个包含新值的字典,以及第二个字典,其中包含数据库中行的先前信息。
我想到了两种方法:
选项A 循环遍历字典与行值比较,如果有任何不同,则中断并更新所有字段。即UPDATE语句将包含所有字段及其值。
代码(在这种情况下是python,但很容易理解)看起来像这样:
for key, value in incoming_dictionary.iteritems():
if old_dictionary[key] != value:
update_row(incoming_dictionary)
break
哪会产生这样的SQL语句:
UPDATE mytable SET field1=... field2=... fieldN=... WHERE = ...
选项B 循环在字典上比较值,而那些不同的值必须存储在另一个字典中,并在循环结束时更新行,将UPDATE语句限制为实际上不同的值。
changed_fields = {}
for key, value in incoming_dictionary.iteritems():
if old_dictionary[key] != value:
changed_fields[key] = value
update_fields(changed_fields)
哪会产生如下的SQL:
UPDATE mytable SET field1=... WHERE = ...
我想说第二个应该在SQL级别上更有效率,但我不太确定。它在编程层面上有一点开销。
我正在使用MS SQL Server,但我的程序解决了不同的RBDMS。感谢。
答案 0 :(得分:2)
您的问题没有一般性答案。不同的数据库以不同方式执例如,MySQL不会更新没有更改的记录(比较是更新操作的一部分)。
通常,更新的费用取决于获取记录,记录更新和修改索引 - 这些操作不仅仅是对内存中数据的更改。作为指导原则,更重要的是有一个索引可以快速获取适当的记录,而不是优化数据库的填充。后者通常是记忆中的操作。
这些指南可能不适用于所有情况。例如,跨越多个页面的大字段的存在将影响性能。对具有索引的字段的更新具有其自身的性能影响。