postgres 使用来自客户端的 unknown/random id 进行更新?
posgres upsert with unknown/random id from client?
您好,我正在尝试 insert/update 某些行的更新插入,但插入部分的 ID 未知。
我的意思是这个
INSERT INTO task (id,name,description,completed)
VALUES
--update
(20,'Do stuff','Stuff to do...',false),
(21,'Do stuff','Stuff to do...',false),
--insert
(unknown_or_random_id,'Do stuff','Stuff to do...',false),
(unknown_or_random_id,'Do stuff','Stuff to do...',false),
ON CONFLICT (id) DO UPDATE
SET name= excluded.name etc....
基本上我从客户端获得的数组包含我必须插入的新项目的随机 ID,我该如何处理?
随机我的意思是像
"01asd",
"02asdc",
"03asdce"
蚀刻...
我想我找到了解决办法
当我知道我得到的 ID 不在数据库中时,我可以像这样使用默认值
'before'
INSERT INTO task (id,name,description,completed)
VALUES
--update
(20,'Do stuff','Stuff to do...',false),
(21,'Do stuff','Stuff to do...',false),
--insert
(unknown_or_random_id,'Do stuff','Stuff to do...',false),
(unknown_or_random_id,'Do stuff','Stuff to do...',false),
ON CONFLICT (id) DO UPDATE
SET name= excluded.name etc....
之后
INSERT INTO task (id,name,description,completed)
VALUES
--update
(20,'Do stuff','Stuff to do...',false),
(21,'Do stuff','Stuff to do...',false),
--insert
(default,'Do stuff','Stuff to do...',false),
(default,'Do stuff','Stuff to do...',false),
ON CONFLICT (id) DO UPDATE
SET name= excluded.name etc....
我只是想知道这样做是否有一些限制
不知道插入时的 id 是完全无关紧要的。唯一的问题是值 id 是否已经存在。您只需要基本的“插入...冲突 (xx) 做更新...”
参见 Demo。注意:demo
在 (id) 上使用 distinct。这严格来说是因为 ID 是随机生成的,很有可能至少两次生成相同的 ID,但是当输入流本身包含重复项时,“冲突时”会抛出异常。
insert into task( id, name, description)
select id, name, description
from <table name> -- or VALUES (...)
on conflict (id)
do update
set name = excluded.name
, description = excluded.description
, completed = true;
您好,我正在尝试 insert/update 某些行的更新插入,但插入部分的 ID 未知。
我的意思是这个
INSERT INTO task (id,name,description,completed)
VALUES
--update
(20,'Do stuff','Stuff to do...',false),
(21,'Do stuff','Stuff to do...',false),
--insert
(unknown_or_random_id,'Do stuff','Stuff to do...',false),
(unknown_or_random_id,'Do stuff','Stuff to do...',false),
ON CONFLICT (id) DO UPDATE
SET name= excluded.name etc....
基本上我从客户端获得的数组包含我必须插入的新项目的随机 ID,我该如何处理?
随机我的意思是像 "01asd", "02asdc", "03asdce" 蚀刻...
我想我找到了解决办法 当我知道我得到的 ID 不在数据库中时,我可以像这样使用默认值
'before'
INSERT INTO task (id,name,description,completed)
VALUES
--update
(20,'Do stuff','Stuff to do...',false),
(21,'Do stuff','Stuff to do...',false),
--insert
(unknown_or_random_id,'Do stuff','Stuff to do...',false),
(unknown_or_random_id,'Do stuff','Stuff to do...',false),
ON CONFLICT (id) DO UPDATE
SET name= excluded.name etc....
之后
INSERT INTO task (id,name,description,completed)
VALUES
--update
(20,'Do stuff','Stuff to do...',false),
(21,'Do stuff','Stuff to do...',false),
--insert
(default,'Do stuff','Stuff to do...',false),
(default,'Do stuff','Stuff to do...',false),
ON CONFLICT (id) DO UPDATE
SET name= excluded.name etc....
我只是想知道这样做是否有一些限制
不知道插入时的 id 是完全无关紧要的。唯一的问题是值 id 是否已经存在。您只需要基本的“插入...冲突 (xx) 做更新...”
参见 Demo。注意:demo
在 (id) 上使用 distinct。这严格来说是因为 ID 是随机生成的,很有可能至少两次生成相同的 ID,但是当输入流本身包含重复项时,“冲突时”会抛出异常。
insert into task( id, name, description)
select id, name, description
from <table name> -- or VALUES (...)
on conflict (id)
do update
set name = excluded.name
, description = excluded.description
, completed = true;