如何 INSERT ... ON CONFLICT DO UPDATE 自动更新 TIMESTAMP?
How to do INSERT ... ON CONFLICT DO UPDATE and update TIMESTAMP automatically?
我有一个 table 与此类似的 PostgreSQL:
我的table:
id
col2
col3
import_ts TIMESTAMP(0) WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
因此,当我执行插入时,我不必为此列指定任何值,并且会自动插入当前时间戳。
但是,当使用如下查询时:
INSERT INTO mytable (id, col2, col3) VALUES (%s, %s, %s)
ON CONFLICT (id) DO UPDATE
SET col2 = %s, col3 = %s;
结果是在INSERT
的情况下,自动插入了import_ts,符合预期;但在 UPDATE
的情况下,列 import_ts
将不会更新。
为了更新 import_ts,因为我正在使用 python
和 psycopg2
,我可以添加 SET
import_ts = %s
并传递当前时间。但是,在一种情况下自动添加时间戳而在另一种情况下我必须添加它,这似乎并不优雅和一致。我更希望它总是由 PostgreSQL 自动完成。这可能吗?
当然可以,只需使用 now()
function:
INSERT INTO mytable (id, col2, col3) VALUES (%s, %s, %s)
ON CONFLICT (id) DO UPDATE
SET col2 = %s, col3 = %s, import_ts = now();
我有一个 table 与此类似的 PostgreSQL:
我的table:
id
col2
col3
import_ts TIMESTAMP(0) WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
因此,当我执行插入时,我不必为此列指定任何值,并且会自动插入当前时间戳。
但是,当使用如下查询时:
INSERT INTO mytable (id, col2, col3) VALUES (%s, %s, %s)
ON CONFLICT (id) DO UPDATE
SET col2 = %s, col3 = %s;
结果是在INSERT
的情况下,自动插入了import_ts,符合预期;但在 UPDATE
的情况下,列 import_ts
将不会更新。
为了更新 import_ts,因为我正在使用 python
和 psycopg2
,我可以添加 SET
import_ts = %s
并传递当前时间。但是,在一种情况下自动添加时间戳而在另一种情况下我必须添加它,这似乎并不优雅和一致。我更希望它总是由 PostgreSQL 自动完成。这可能吗?
当然可以,只需使用 now()
function:
INSERT INTO mytable (id, col2, col3) VALUES (%s, %s, %s)
ON CONFLICT (id) DO UPDATE
SET col2 = %s, col3 = %s, import_ts = now();