检测行是否已更新或插入
我正在用ON CONFLICT
进行INSERT
,使用java进行postgre。 有没有办法找出executeUpdate
插入行还是更新它?
您可以查看系统列xmax
来区分它们。 在这种情况下,插入的行为0
。
CREATE TABLE tbl(id int PRIMARY KEY, col int); INSERT INTO tbl VALUES (1, 1);
INSERT INTO tbl(id, col) VALUES (1,11), (2,22) ON CONFLICT (id) DO UPDATE SET col = EXCLUDED.col RETURNING *, (xmax = 0) AS inserted ;
这是基于未记录的实现细节,可能在将来的版本中发生变化(即使不太可能)。 它适用于Postgres 9.5和9.6。
它的美妙之处:您不需要引入额外的列。
详细说明:
- PostgreSQL Upsert使用系统列XMIN,XMAX等来区分插入和更新的行