如何 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,因为我正在使用 pythonpsycopg2,我可以添加 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();