Чтобы игнорировать повторяющиеся ключи во время операции COPY FROM в PostgreSQL, вы можете использовать один из следующих методов:
Метод 1: используйте предложение ON CONFLICT DO NOTHING
COPY table_name (column1, column2, ...) FROM 'file.csv' WITH (FORMAT csv) ON CONFLICT DO NOTHING;
Этот метод предписывает PostgreSQL пропускать строки, которые могут привести к нарушению дублирования ключа.
Метод 2. Использование временной промежуточной таблицы
-- Step 1: Create a temporary staging table
CREATE TEMPORARY TABLE staging_table (LIKE table_name);
-- Step 2: Copy data to the staging table
COPY staging_table (column1, column2, ...) FROM 'file.csv' WITH (FORMAT csv);
-- Step 3: Insert data from the staging table, ignoring duplicates
INSERT INTO table_name (column1, column2, ...)
SELECT column1, column2, ...
FROM staging_table
ON CONFLICT DO NOTHING;
-- Step 4: Drop the staging table
DROP TABLE staging_table;
Этот метод предполагает сначала копирование данных во временную промежуточную таблицу, а затем вставку данных из промежуточной таблицы в целевую таблицу, игнорируя любые нарушения дублирования ключей.
Метод 3. Используйте инструмент pgloader.
В качестве альтернативы вы можете использовать инструмент pgloader, который предоставляет более расширенные функции для загрузки данных, включая возможность обработки дубликаты ключей. Сначала установите pgloaderс помощью менеджера пакетов вашей операционной системы. Затем создайте файл конфигурации (например, config.load) со следующим содержимым:
LOAD CSV
FROM 'file.csv' (encoding 'UTF-8', skipheader 1)
INTO postgresql://username:password@localhost:5432/database_name.table_name
WITH (fields terminated by ',')
-- Ignore duplicate keys
BEFORE LOAD DO
$$ DROP TABLE IF EXISTS temp_table; $$,
-- Load data into a temporary table
BEFORE LOAD DO
$$ CREATE TEMP TABLE temp_table (LIKE table_name); $$,
-- Insert data from the temporary table, ignoring duplicates
AFTER LOAD DO
$$ INSERT INTO table_name SELECT * FROM temp_table ON CONFLICT DO NOTHING; $$;
Наконец, выполните следующую команду для загрузки данных:
pgloader config.load
Этот метод обеспечивает более гибкий и мощный подход к обработке повторяющихся ключей в процессе загрузки данных.