postgresql как обновить другую таблицу во время конфликта

#sql #postgresql

Вопрос:

У меня есть два стола

 CREATE TABLE people (  name VARCHAR(100) NOT NULL,  company_id int8 NOT NULL, );  CREATE TABLE company (  id int8 NOT NULL, );  

Я хочу скопировать данные из csv в БД. Это мой сценарий

 BEGIN  CREATE TEMP TABLE tmp_company  ON COMMIT DROP AS SELECT * FROM company WITH NO DATA;  COPY tmp_company FROM 'company.csv' WITH CSV HEADER  DELIMITER as ',';  INSERT INTO company  SELECT * FROM tmp_company  ON CONFLICT DO NOTHING;   CREATE TEMP TABLE tmp_people  ON COMMIT DROP AS SELECT * FROM people WITH NO DATA;  COPY tmp_people FROM 'people.csv' WITH CSV HEADER  DELIMITER as ',';  INSERT INTO people  SELECT * FROM tmp_people  ON CONFLICT DO NOTHING; COMMIT;  

Если существующий идентификатор компании найден в company таблице, Я должен сделать company.id =1 и замените новый идентификатор компании для соответствующих people записей.

Пример:

 company.csv id 1 5  people.csv name,company_id tom,1 paul,5  existing company table data id 1 2  existing people table data name,company_id tom,1 paul,2  After copying data from csv to DB, the data should look like  company table data id 1 2 3 lt;-- from csv data, as 1,2 are used, set id=3 5  people table data name,company_id tom,1 paul,2 tom,3 lt;-- from csv data paul,5 lt;-- from csv data  

Как я могу это сделать? Мне интересно, могу ли я добавить логику после ON CONFLICT...

Правка 1: Размер двух таблиц составляет около 5 тб., а два csv содержат 5 записей.

Ответ №1:

Во-первых, вы должны использовать bigserial тип данных вместо int8 идентификатора столбца таблицы company , чтобы автоматически увеличивать идентификатор при вставке новой строки.

Затем вам следует создать внешний ключ между вашими таблицами people и company с возможностью ON UPDATE CASCADE , чтобы любое изменение в id столбце таблицы company автоматически распространялось на company_id столбец в таблице people .

 CREATE TABLE company (  id bigserial NOT NULL );  CREATE TABLE people (  name VARCHAR(100) NOT NULL,  company_id int8 NOT NULL,  CONSTRAINT fkey FOREIGN KEY company_id REFERENCES company(id) ON UPDATE CASCADE );  

Комментарии:

1. Я имею дело с устаревшими таблицами БД, я не могу изменить структуру таблицы.