Sobes.tech
Senior

Como proteger a tabela de destino contra duplicados ao inserir dados de uma tabela temporária? Como atualizar os registros existentes com dados mais recentes (upsert)?

sobes.tech IA

Resposta da IA

Чтобы защитить целевую таблицу от дубликатов при вставке данных из временной таблицы и одновременно обновить существующие записи более свежими данными (операция upsert), можно использовать следующие подходы:

  1. Уникальные ограничения и индекс

    • На целевой таблице должен быть установлен уникальный индекс или ограничение уникальности по ключевым полям, которые определяют дубликаты.
  2. Использование конструкции UPSERT

    • В современных СУБД (например, PostgreSQL, MySQL) есть поддержка конструкции INSERT ... ON CONFLICT ... DO UPDATE или INSERT ... ON DUPLICATE KEY UPDATE.

Пример для PostgreSQL:

INSERT INTO target_table (id, data, updated_at)
SELECT id, data, updated_at FROM temp_table
ON CONFLICT (id) DO UPDATE SET
    data = EXCLUDED.data,
    updated_at = EXCLUDED.updated_at
WHERE target_table.updated_at < EXCLUDED.updated_at;

Здесь:

  • ON CONFLICT (id) — конфликт по уникальному ключу id.
  • В блоке DO UPDATE обновляем поля, если данные из временной таблицы свежее (например, по полю updated_at).
  1. Альтернативный подход — MERGE (если поддерживается)
MERGE INTO target_table t
USING temp_table s
ON t.id = s.id
WHEN MATCHED AND t.updated_at < s.updated_at THEN
  UPDATE SET data = s.data, updated_at = s.updated_at
WHEN NOT MATCHED THEN
  INSERT (id, data, updated_at) VALUES (s.id, s.data, s.updated_at);
  1. Предварительная очистка дубликатов во временной таблице

Если во временной таблице могут быть дубликаты, стоит сначала их устранить, например, с помощью DISTINCT или агрегирующих функций.

Таким образом, комбинация уникальных ограничений и UPSERT-операций обеспечивает защиту от дубликатов и обновление существующих записей более свежими данными.