PostgreSQL 9.4使用UNIQUE约束将数据从备份文件插入到表中

时间:2016-06-20 13:57:48

标签: postgresql postgresql-9.4

我已经看过很多类似的话题,但没有任何明确的解决方案。

我有什么: 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;更新表格的简单方法并将数据输入其中(只有生产数据库表中不存在的数据)?

1 个答案:

答案 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_duplicatesDelete 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);