我已经看过很多类似的话题,但没有任何明确的解决方案。
我有什么: Amazon RDS上的生产数据库。我需要从位于我PC上的转储(.backup)中将数据恢复/输入到该DB中的一个表。
这是表结构:
CREATE TABLE condos
(
name text NOT NULL,
latitude numeric,
longtitude numeric,
condo_id serial NOT NULL,
city text NOT NULL,
country text NOT NULL,
address text,
district text,
CONSTRAINT pk_condo_id PRIMARY KEY (condo_id),
CONSTRAINT uniq_title UNIQUE (name)
)
问题:一旦我尝试从本地数据库恢复它,我就会遇到UNIQUE约束违规错误:
pg_restore: [archiver (db)] COPY failed for table "condos": ERROR: duplicate key value violates unique constraint "pk_condo_id"
DETAIL: Key (condo_id)=(21) already exists.
此外,还有其他表与表condos
有关系,我不想更新整个数据库。
我知道这不是我第一次做这个程序,所以我的问题是 - 什么是 best& amp;更新表格的简单方法并将数据输入其中(只有生产数据库表中不存在的数据)?
答案 0 :(得分:1)
简单和最好可能并不总是相同。
创建另一个类似于您的表格,让我们将其命名为condos_tmp
。将数据导入此表。假设您的转储没有重复的条目,导入将成功。然后做:
DELETE FROM condos_tmp WHERE condo_id in (SELECT condo_id FROM condos)
请注意,如果您有数百万条记录,此查询将花费很长时间。接下来是一个简单的插入选择
INSERT INTO condos SELECT * FROM condos_tmp
即使您的转储具有重复数据,也可以使用此解决方案。
ALTER TABLE condos DROP CONSTRAINT pk_condo_id;
ALTER TABLE condos DROP CONSTRAINT uniq_title;
现在导入您的数据。然后寻找重复。请参考https://wiki.postgresql.org/wiki/Deleting_duplicates和Delete completely duplicate rows in PostgreSQL (and keep only 1)决定删除哪一项。这些链接说明了如何为每种情况编写查询。
然后加回约束。
ALTER TABLE condos ADD CONSTRAINT pk_condo_id PRIMARY KEY(condo_id);
ALTER TABLE condos ADD CONSTRAINT uniq_title UNIQUE(uniq_title);