我正在运行这样的事情:
cursor.execute(
'''
UPDATE my_table
SET name=%s, about=%s, title=%s
WHERE id=%s
''',
(name, about, title, id_)
)
保证只更新一行,因为它根据id
主键进行更新。
但是,大多数情况下,实际字段中只有一个发生了变化,即about
和title
已更新"它们已经是相同的值,只有name
实际上已经改变了。
如何实际更改哪些列?这需要记录每个单独的更改。
答案 0 :(得分:2)
您可以在更新前选择值,并在最终查询中使用RETURNING *
比较值,例如:
t=# create table m1 (i int, e int);
CREATE TABLE
Time: 1.855 ms
t=# insert into m1 select 1,2;
INSERT 0 1
Time: 1.037 ms
t=# begin;
BEGIN
t=# with o as (select * from m1 where i=1)
,u as (update m1 set e=3 where i=1 returning *)
select * from o
join u on o.i = u.i
;
i | e | i | e
---+---+---+---
1 | 2 | 1 | 3
(1 row)
所以你可以针对u.e <> o.e
或类似的