sql - Postgres - 关于冲突 - 如何知道是否发生了更新而不是插入

标签 sql postgresql upsert postgresql-9.5

<分区>

我有一张 table

CREATE TABLE foo
(
    f0 int,
    time_stamp timestamp,
    CONSTRAINT foo_pk PRIMARY KEY (f0)
)

我需要大量写入此表,因此性能是关键。有时,我会写一条记录,其中包含 f0 的现有值,并且只会将 time_stamp 更新为当前时间。为此,我使用了 ON CONFLICT..DO UPDATE 子句。

问题 是我需要知道是否发生了INSERTUPDATE

我虽然在使用第二个 is_update 列。插入时插入false

`ON CONFLICT .. DO UPDATE set is_update=true`

然后使用RETURNING is_update 得到我想要的。问题是引入了一个与数据本身无关的附加列。

最佳答案

为时间戳使用两列是常见的做法。 creation_timestamp 列将在插入时设置一次。而 update_timestamp 会将最后一次覆盖更新的时间戳保存到该记录。

在每个“upsert”中,您可以检查是否尚未设置 update_timestamp。

INSERT INTO foo (f0, creation_timestamp) VALUES (1, NOW())
ON CONFLICT (f0)
DO UPDATE
SET f0=EXCLUDED.f0, update_timestamp=NOW()
RETURNING update_timestamp IS NULL

关于sql - Postgres - 关于冲突 - 如何知道是否发生了更新而不是插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36313120/

相关文章:

mysql - 在mysql查询结果中添加迄今为止的小时数

postgresql - yoyo migrations 将选定的迁移应用到 postgreSQL

Postgresql:可能在 lob 内进行全文搜索吗?

javascript - Sequelize upsert() 从不更新,只插入

java - PostgreSQL “syntax error at end of input” 在 INSERT INTO 后出现 ON CONFLICT DO UPDATE 条件

mysql - 我如何更新表中的一行或如果它不存在则插入它?

sql - 亚马逊雅典娜 : Convert bigint timestamp to readable timestamp

java - 异常 java.sql.SQLException : Incorrect string value: '\xF0\x9F\x92\xBC' for column 'Rins' at row 1 at

sql - Postgres无限 self 加入

node.js - 如何使用 postgres 查询修复函数以防止 SQL 注入(inject)