Sobes.tech
Senior

Wie schützt man die Zieltabelle vor Duplikaten beim Einfügen von Daten aus einer temporären Tabelle? Wie aktualisiert man bestehende Datensätze mit neueren Daten (upsert)?

sobes.tech KI

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