2016-12-15 3 views
-1

Я хотел бы объединить две таблицы с теми же столбцами в postgresql. Фактически, у меня уже есть одна используемая таблица, и я хотел бы добавить содержимое дампа с другого сервера для объединения таблиц. Обе таблицы имеют одинаковые столбцы, включая первичный ключ ... Поэтому, когда я пытаюсь загрузить дамп, я получаю дубликаты первичных ключей. Я попытался загрузить дамп в отдельную таблицу и вставить содержимое этой новой таблицы в первую с INSERT/SELECT, но поле первичного ключа генерирует ошибки из-за дубликатов, и я не могу опустить его в вставить (или получить нарушение «не-нулевого ограничения»).Postgresql: добавьте содержимое таблицы в другую таблицу

Каким будет синтаксис (или решение) для добавления содержимого второй таблицы (или ее дампа) в конце первого с правильными первичными ключами?

Короче говоря, с примером, я хотел бы:

# 
# First table: 
# 
CREATE TABLE t_table1 (
    f_fullcmd text, 
    f_id integer NOT NULL, 
    f_body text 
); 

INSERT INTO t_table1 VALUES ('command1', 1, 'This is my first command'); 
INSERT INTO t_table1 VALUES ('command2', 2, 'This is my second command'); 
INSERT INTO t_table1 VALUES ('command3', 3, 'This is my third command'); 

ALTER TABLE ONLY t_table1 ADD CONSTRAINT pk_1_t_table1 PRIMARY KEY (f_id); 

# 
# Second table to append to t_table1 
# 
CREATE TABLE t_table2 (
    f_fullcmd text, 
    f_id integer NOT NULL, 
    f_body text 
); 

INSERT INTO t_table2 VALUES ('run-1', 1, 'This is my first run'); 
INSERT INTO t_table2 VALUES ('run-2', 2, 'This is my second run'); 
INSERT INTO t_table2 VALUES ('run-3', 3, 'This is my third run'); 

ALTER TABLE ONLY t_table2 ADD CONSTRAINT pk_1_t_table2 PRIMARY KEY (f_id); 

# 
# Resulting table: 
# 
CREATE TABLE t_merge (
    f_fullcmd text, 
    f_id integer NOT NULL, 
    f_body text 
); 

INSERT INTO t_merge VALUES ('command1', 1, 'This is my first command'); 
INSERT INTO t_merge VALUES ('command2', 2, 'This is my second command'); 
INSERT INTO t_merge VALUES ('command3', 3, 'This is my third command'); 
INSERT INTO t_merge VALUES ('run-1', 4, 'This is my first run'); 
INSERT INTO t_merge VALUES ('run-2', 5, 'This is my second run'); 
INSERT INTO t_merge VALUES ('run-3', 6, 'This is my third run'); 

ALTER TABLE ONLY t_merge ADD CONSTRAINT pk_1_t_merge PRIMARY KEY (f_id); 

входы являются отвалы t_table1 и t_table2, и хотел бы получить t_merge.

+0

Какие «правильные» первичные ключи? Как обычно генерируются ключи для первой таблицы? –

+0

У вас есть автономическое поле для первичного ключа? Если у вас есть таблица A с 'pkField_id = 1' и таблица B также с' pkField_id = 1', какой результат вы ожидаете? –

+0

Возможно, вы задаете неправильный вопрос [** Что такое проблема XY? **) (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) , потому что если обе таблицы имеют одинаковый идентификатор, вы нарушите ПК. Поэтому вам нужно создать другое поле, чтобы быть PK. Или решить, что является жизнеспособным обходным путем. –

ответ

0

ОК, так что после некоторых испытаний и исследований, кажется, последовательность, чтобы сделать это:

-- 
-- First table: 
-- 
CREATE TABLE t_table1 (
    f_fullcmd text, 
    f_id integer NOT NULL, 
    f_body text 
); 

INSERT INTO t_table1 VALUES ('command1', 1, 'This is my first command'); 
INSERT INTO t_table1 VALUES ('command2', 2, 'This is my second command'); 
INSERT INTO t_table1 VALUES ('command3', 3, 'This is my third command'); 

ALTER TABLE ONLY t_table1 ADD CONSTRAINT pk_1_t_table1 PRIMARY KEY (f_id); 

-- 
-- Second table to append to t_table1 
-- 
CREATE TABLE t_table2 (
    f_fullcmd text, 
    f_id integer NOT NULL, 
    f_body text 
); 

INSERT INTO t_table2 VALUES ('run-1', 1, 'This is my first run'); 
INSERT INTO t_table2 VALUES ('run-2', 2, 'This is my second run'); 
INSERT INTO t_table2 VALUES ('run-3', 3, 'This is my third run'); 

ALTER TABLE ONLY t_table2 ADD CONSTRAINT pk_1_t_table2 PRIMARY KEY (f_id); 

-- 
-- Create a temp table: 
-- 
CREATE TABLE t_table3 (
    f_fullcmd text, 
    f_id serial NOT NULL, 
    f_body text 
); 

SELECT setval('t_table3_f_id_seq', (SELECT MAX(f_id)+1 FROM t_table1), false); 

-- 
-- Merge table2 into table3 
-- 
INSERT INTO t_table3 (f_fullcmd, f_body) SELECT f_fullcmd, f_body FROM t_table2; 

-- 
-- Merge back into table1: 
-- 
INSERT INTO t_table1 (f_fullcmd, f_id, f_body) SELECT f_fullcmd, f_id, f_body FROM t_table3; 

При создании t_table3, изменить первичный ключ, последовательность, а затем установить его начальное значение до максимума значение первичного ключа первой таблицы +1, вставьте в t_table3 содержимое t_table2 (os перегенерирует первичный ключ как последовательность) и, наконец, импортируйте содержимое t_table3 в t_table1.

0

Если обе таблицы являются autonumeric уже, вместо того, чтобы создать временную таблицу проще сделать это:

INSERT INTO t_table1 (f_fullcmd, f_id, f_body) 
SELECT f_fullcmd, 
     f_id + x.t1_max, 
     f_body 
FROM t_table2 
CROSS JOIN (SELECT MAX(f_id) t1_max FROM t_table1) x ; 
Смежные вопросы