Как работает ON CONFLICT при множественном VALUES?

При использовании оператора ON CONFLICT в PostgreSQL, который позволяет обработать конфликты при вставке данных в таблицу, в случае множественного VALUES, возможны следующие сценарии:

1. Уникальное ограничение для одного из полей:
- Если вставляемая строка содержит значения, которые уже существуют в поле с уникальным ограничением, то срабатывает действие ON CONFLICT.
- ON CONFLICT DO NOTHING: Ничего не делать и продолжить выполнение операции вставки, пропуская конфликтующие строки. Не вызывает ошибку.
- ON CONFLICT DO UPDATE SET: Обновить строки, которые конфликтуют с уникальным ограничением, используя новые значения из вставляемых строк.

2. Уникальное ограничение для составного ключа (несколько полей):
- Если вставляемая строка содержит значения, которые уже существуют в составном ключе, то срабатывает действие ON CONFLICT.
- ON CONFLICT DO NOTHING: Пропустить конфликтующие строки и продолжить выполнение операции вставки. Не вызывает ошибку.
- ON CONFLICT DO UPDATE SET: Обновить строки, которые конфликтуют с составным ключом, используя новые значения из вставляемых строк.

3. Уникальное ограничение для первичного ключа:
- Если вставляемая строка содержит значения, которые уже существуют в первичном ключе, то срабатывает действие ON CONFLICT.
- ON CONFLICT DO NOTHING: Пропустить конфликтующие строки и продолжить выполнение операции вставки. Не вызывает ошибку.
- ON CONFLICT DO UPDATE SET: Обновить строки, которые конфликтуют с первичным ключом, используя новые значения из вставляемых строк.

4. Нет уникальных ограничений:
- Если нет уникальных ограничений, то при множественном VALUES оператор ON CONFLICT будет игнорироваться, поскольку нет оснований для конфликта.

Ключевые слова DO NOTHING и DO UPDATE SET позволяют выполнить определенные действия в случае конфликта. DO UPDATE SET позволяет обновить конфликтующие строки, используя новые значения вставляемых строк. Это может быть полезно, если вы хотите обновлять данные, которые уже существуют в таблице, вместо пропуска конфликтующих строк.

Важно отметить, что оператор ON CONFLICT доступен только в PostgreSQL версии 9.5 и выше.