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);
我看过很多类似的话题,但没有明确的解决方案。
我有: 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);