PostgreSQL 9.4 使用唯一约束将备份文件中的数据插入 table

PostgreSQL 9.4 Insert data from backup file into the table with UNIQUE constraint

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

我有: Amazon RDS 上的生产数据库。我需要 restore/input 数据从位于我的 PC 上的转储 (.backup) 到该数据库中的 table 之一。

这里是 table 结构:

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)
)

问题:当我试图从本地数据库恢复它时,我收到一个违反唯一约束的错误:

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.

此外,还有其他 table 与 table condos 有关系,我不想更新整个数据库。

我知道这不是我第一次执行此程序,所以我的问题是 - 更新 table[=28 的最佳且简单的方法是什么=] 并将数据输入其中(仅生产数据库 table 中不存在的数据)?

简单和最好可能并不总是相同的。

通过临时插入 table

创建另一个 table 类似于您让我们将其命名为 condos_tmp 的那个。将您的数据导入此 table。假设您的转储没有重复条目,导入将成功。然后做:

DELETE FROM condos_tmp WHERE condo_id in (SELECT condo_id FROM condos)

请注意,如果您有数百万条记录,此查询将花费很长时间。接下来是简单的插入 select

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 and 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);