Sobes.tech
Назад к вопросам
Senior
12

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

Компании, где спрашивали
firebirds tours

Ответ от нейросети

sobes.tech AI

Чтобы защитить целевую таблицу от дубликатов при вставке данных из временной таблицы и одновременно обновить существующие записи более свежими данными (операция 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-операций обеспечивает защиту от дубликатов и обновление существующих записей более свежими данными.