#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. Я имею дело с устаревшими таблицами БД, я не могу изменить структуру таблицы.