免责声明:理论问题.
这里有几个问题,询问如何在PostgreSQL upsert语句中区分插入和更新的行.
这是一个简单的例子:
nd@postgres=# create table t(i int primary key, x int);
nd@postgres=# insert into t values(1,1);
nd@postgres=# insert into t values(1,11),(2,22)
on conflict(i) do update set x = excluded.i*11
returning *, xmin, xmax;
????????????????????????
? i ? x ? xmin ? xmax ?
????????????????????????
? 1 ? 11 ? 7696 ? 7696 ?
? 2 ? 22 ? 7696 ? 0 ?
????????????????????????
Run Code Online (Sandbox Code Playgroud)
所以,xmax> 0(或xmax= xmin) - 行已更新; xmax= 0 - …
我有一张桌子
CREATE TABLE foo
(
f0 int,
time_stamp timestamp,
CONSTRAINT foo_pk PRIMARY KEY (f0)
)
Run Code Online (Sandbox Code Playgroud)
我需要大量写入此表,因此性能是关键.有时,我会写一个具有现有值的记录,f0并且只会更新time_stamp到当前时间.为此,我使用了一个ON CONFLICT..DO UPDATE条款.
问题是我需要知道是否INSERT已经发生或是UPDATE.
我虽然使用第二is_update列.插入,插入false和
`ON CONFLICT .. DO UPDATE set is_update=true`
Run Code Online (Sandbox Code Playgroud)
然后RETURNING is_update用来得到我想要的东西.问题在于引入了与数据本身无关的附加列.
在 Postgres 10.10 数据库中,我有一个 tabletable1和一个AFTER INSERT触发器table1for table2:
CREATE TABLE table1 (
id SERIAL PRIMARY KEY,
-- other cols
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL
);
CREATE UNIQUE INDEX table1_pkey ON table1(id int4_ops);
CREATE TABLE table2 (
id SERIAL PRIMARY KEY,
table1_id integer NOT NULL REFERENCES table1(id) ON UPDATE CASCADE,
-- other cols (not used in query)
created_at timestamp with time zone NOT NULL,
updated_at timestamp …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关 postgres 方言上的 upsert 操作的 SqlAlchemy 文档,网址为http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#insert-on-conflict-upsert
有没有办法知道更新插入是插入还是更新?
该文档似乎省略了这个细节。
我正在考虑使用 PostgreSQLINSERT .. ON CONFLICT UPDATE功能。理想情况下,我将能够区分哪些行已成功插入,哪些行已更新。有没有办法做到这一点?
postgresql ×5
upsert ×3
sql ×2
plpgsql ×1
python ×1
sequelize.js ×1
sqlalchemy ×1
timestamp ×1
transactions ×1