【问题标题】:How to insert bulk rows and ignore duplicates in postgresql 9.3 [duplicate]如何在postgresql 9.3中插入批量行并忽略重复项[重复]
【发布时间】:2018-12-11 10:45:05
【问题描述】:

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

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.3 更长 supported 如果您升级到最新版本(例如 11),您可以轻松使用 9.5 中引入的 on conflict 功能
  • @a_horse_with_no_name,如果我将我的 postgres 升级到最新版本,我应该如何为批量插入编写 ON CONFLICT 语法,正如我在问题中所说的那样?你能给我一个示例语法吗?
  • 请阅读重复的问题。他们都回答了您的问题(包括针对您过时版本的解决方案)
  • 作为重复提到的问题并不是这个问题的真正重复。 OP 想要插入行并忽略,而不是更新,并且对插入忽略/更新的任何 Postgres 语法不特别感兴趣,他只想获取行。这实际上与这个问题更相似:stackoverflow.com/questions/47541579/… - 请参阅我的答案,了解在 Postgres 9.3 中执行此操作的简单方法

标签: postgresql postgresql-9.3 upsert on-duplicate-key


【解决方案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;

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

【讨论】:

  • 问题明确表示 PG 9.3
  • @404 在
  • @TimBiegeleisen,我喜欢你的回答,但我传入的值是一些动态数据,所以我可以像你说的那样明确地写 select 语句。对于这样的动态数据,我怎样才能达到同样的效果?
  • 先将您的VALUES 插入临时表,然后使用我的答案。
  • @TimBiegeleisen,我已将 postgres 升级到版本 11。我使用了 INSERT INTO 权限(用户名,权限)值(('john','ticket_view'),('john','ticket_modify' ), ('john','ticket_approve')) 在冲突中什么都不做;现在我在“on”处或附近收到此错误`语法错误`。我很挣扎,但不知道为什么这会停止查询!请帮帮我!
猜你喜欢
  • 1970-01-01
  • 2020-01-03
  • 2016-07-29
  • 1970-01-01
  • 2013-06-23
  • 2017-06-02
  • 2023-03-06
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多