怎么做INSERT ... ON CONFLICT DO UPDATE并自动更新TIMESTAMP?

时间:2017-02-11 18:00:35

标签: python postgresql psycopg2

我有一个类似于这个的PostgreSQL表:

mytable的:

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自动完成。这可能吗?

1 个答案:

答案 0 :(得分:3)

当然,只需使用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();