【发布时间】:2016-06-27 06:26:21
【问题描述】:
我有这张表(由 Django 生成):
CREATE TABLE feeds_person (
id serial PRIMARY KEY,
created timestamp with time zone NOT NULL,
modified timestamp with time zone NOT NULL,
name character varying(4000) NOT NULL,
url character varying(1000) NOT NULL,
email character varying(254) NOT NULL,
CONSTRAINT feeds_person_name_ad8c7469_uniq UNIQUE (name, url, email)
);
我正在尝试使用带有ON CONFLICT 子句的INSERT 批量插入大量数据。
问题是我需要为 所有 行取回 id,无论它们是否已经存在。
在其他情况下,我会这样做:
INSERT INTO feeds_person (created, modified, name, url, email)
VALUES blah blah blah
ON CONFLICT (name, url, email) DO UPDATE SET url = feeds_person.url
RETURNING id
执行UPDATE 会导致语句返回该行的id。除了,它不适用于此表。我认为它不起作用,因为我有多个唯一的字段,而在其他情况下,我使用了这种方法,我只有一个唯一的字段。
尝试通过 Django 的游标运行 SQL 时出现此错误:
django.db.utils.ProgrammingError: ON CONFLICT DO UPDATE command cannot affect row a second time HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained values.
如何使用此表进行批量插入并取回已插入和现有的 id?
【问题讨论】:
-
I need to get the id back for all of the rows。显然,您的VALUES列表中的(name, url, email)有重复项。你需要保存那些骗子还是可以折叠?如果是,从一组骗子中挑选哪个同伴?您是否必须处理并发写访问? -
@ErwinBrandstetter 我每分钟从我定期请求数据的外部数据源转储数万条记录。每次我从外部源请求数据时,它都会返回一些我已经拥有的数据以及新数据。我不需要更新我已经拥有的数据。我不知道为什么它没有点击该错误表明我的 VALUES 中有重复项。 VALUES 中的重复项只能合并为一条记录。
标签: sql django postgresql upsert sql-returning