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;