我有许多行数据要插入表中。表中已经有数据。当我进行这样的批量插入时,
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中的重复问题?我只想插入所有行。如果存在类似的行,我想忽略它。我怎样才能做到这一点?我欢迎您的帮助。
答案 0 :(得分:1)
假设您使用的是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;
如果由于数据过多而无法使用上述解决方案,那么一种选择是首先将元组插入临时表,然后使用上述查询,例如
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'));
然后,使用以下查询插入,同时忽略重复项:
INSERT INTO permission (username, permission)
SELECT username, permission
FROM temp_permission
ON CONFLICT (username, permission) DO NOTHING;
然后,您可以删除临时表。