如何在postgresql 9.3中插入批量行并忽略重复项

How to insert bulk rows and ignore duplicates in postgresql 9.3

本问题已经有最佳答案,请猛点这里访问。

我有很多行数据要插入表中。 表中已有数据。 当我像这样做批量插入时,

1
INSERT INTO permission(username, permission) VALUES(('john','ticket_view'), ('john','ticket_modify'), ('john','ticket_approve'));

但我的表已经有一行john, ticket_view在这种情况下,我上面的插入查询以错误duplicate key value violates unique constraint结束。

如何在postgresql 9.3中忽略这个重复的问题? 我只想插入所有行。 如果存在类似的行,我想忽略它。 我怎样才能做到这一点? 我欢迎你的帮助。


假设您使用的是Postgres 9.5或更高版本,您可以尝试使用ON CONFLICT并将插入内容改为INSERT INTO ... SELECT

1
2
3
4
5
INSERT INTO permission (username, permission)
SELECT 'John', 'ticket_view' UNION ALL
SELECT 'John', 'ticket_modify' UNION ALL
SELECT 'John', 'ticket_approve'
ON CONFLICT (username, permission) DO NOTHING;

如果您因为数据太多而无法使用上述解决方案,那么一个选项是首先将您的元组插入临时表,然后使用上述查询,例如:

1
2
3
4
5
6
7
8
9
10
CREATE TEMPORARY TABLE temp_permission (
    username VARCHAR NOT NULL,
    permission VARCHAR NOT NULL
)

INSERT INTO temp_permission (username, permission)
VALUES
    (('John', 'ticket_view'),
     ('John', 'ticket_modify'),
     ('John', 'ticket_approve'));

然后,使用以下查询插入而忽略重复项:

1
2
3
4
INSERT INTO permission (username, permission)
SELECT username, permission
FROM temp_permission
ON CONFLICT (username, permission) DO NOTHING;

之后,您可以删除临时表。