Как в Amazon Redshift можно массово вставлять строки, только если они еще не существуют?

В Redshift я выполняю массовую вставку значений в таблицу. Однако я хочу вставить в этот список только те значения, которых еще нет в таблице, чтобы избежать дублирования.

INSERT INTO $TEST_TABLE values (A, 1), (B, 2), (C, 3)

Если таблица уже содержит (A, 1), я хочу, чтобы оператор вставлял только (B, 2) и (C, 3).

Спасибо!


person Simberific    schedule 28.04.2016    source источник


Ответы (1)


Не существует автоматического способа вставлять только несуществующие строки (часто это называется UPSERT = Обновить существующие строки, вставить новые строки).

Вы можете загрузить данные во временную таблицу, а затем выполнить такую ​​команду, чтобы вставить только те строки, которых там нет:

INSERT INTO target
SELECT * FROM temp
WHERE temp.primary_key NOT IN (SELECT DISTINCT primary_key FROM target)

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

person John Rotenstein    schedule 29.04.2016
comment
Привет, как мне написать, если у меня составной первичный ключ? INSERT INTO target SELECT * FROM temp WHERE temp.primary_key NOT IN (SELECT DISTINCT primary_key FROM target) AND temp.primary_key_2 NOT IN (SELECT DISTINCT primary_key_2 FROM target) - person Andrew Lam; 20.12.2018
comment
@AndrewLam Задайте новый вопрос, а не задавайте старый вопрос в комментариях. - person John Rotenstein; 21.12.2018