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

Vel*_*man 1 postgresql upsert on-duplicate-key postgresql-9.3

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

INSERT INTO permission(username, permission) values(('john','ticket_view'), ('john','ticket_modify'), ('john','ticket_approve'));
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*sen 6

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

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;
Run Code Online (Sandbox Code Playgroud)

如果由于数据太多而无法使用上述解决方案,那么一种选择是先将元组插入到临时表中,然后使用上述查询,例如

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'));
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO permission (username, permission)
SELECT username, permission
FROM temp_permission
ON CONFLICT (username, permission) DO NOTHING;
Run Code Online (Sandbox Code Playgroud)

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