对于批量输入,如何更新匹配的行并将不匹配的行作为新行插入?

时间:2019-06-09 19:44:12

标签: postgresql

我有一个表“ employee”,其中有两列“ firstname”和“ lastname”,并且对“ lastname”列具有唯一的约束。

如果我要发送多行,如何从输入中更新匹配的行,并为不匹配的行创建新行。

数据库中的现有数据:

|id  | firstname   | lastname  |
+----+-------------+-----------+
|  1 | John        | Doe       |

输入行:

| firstname | lastname  |
+-----------+-----------+
| John1     | Doe       | 
| Bar       | foo       |

这是我正在使用的脚本:

INSERT INTO Identification (firstname,lastname)
    (VALUES 
    ('John1','Doe'),
    ('Bar','foo')) as u2 
ON CONFLICT ON CONSTRAINT lname_unique_constraint 
DO UPDATE
    SET 
    firstname = u2.firstname
RETURNING Id;

它给了我这个错误:

  

错误:“ as”处或附近的语法错误

如果脚本可以正常运行,则应使数据库保持以下状态:

|id  | firstname   | lastname  |
+----+-------------+-----------+
|  1 | John1       | Doe       |
|  2 | Bar         | foo       |

注意: 我正在使用PostgreSQL 10.6,并且id列的类型为number并设置为auto sequence。

1 个答案:

答案 0 :(得分:1)

您可以使用EXCLUDED

  

INSERT

     

请注意,特殊的排除表用于引用最初建议插入的值

INSERT INTO Identification (firstname,lastname)
    VALUES 
    ('John1','Doe'),
    ('Bar','foo') 
ON CONFLICT ON CONSTRAINT fname_unique_constraint 
DO UPDATE
    SET 
    firstname = EXCLUDED.firstname
RETURNING Id;

db<>fiddle demo