@nurzhannogerbek

Как применить ON CONFLICT для отслеживания изменений при INSERT?

Здравствуйте, товарищи! Помогите пожалуйста разобраться.

В базе данных PostgreSQL есть таблица со следующей структурой:
| survey_id                            | employee            | status (default: false) |
|--------------------------------------|---------------------|-------------------------|
| 66c89a34-fff2-4cbc-a542-b1e956a352f3 | NNogerbek@gmail.com | true                    |
| 66c89a34-fff2-4cbc-a542-b1e956a352f3 | DJony@gmail.com     | true                    |


Следующий SQL запрос создает новые 2 записи в таблице:
INSERT INTO SURVEYS_EMPLOYEES_RELATIONSHIP (SURVEY_ID, EMPLOYEE)
SELECT '66c89a34-fff2-4cbc-a542-b1e956a352f3' SURVEY_ID, EMPLOYEE FROM UNNEST(ARRAY['NNogerbek@gmail.com', 'IKim@gmail.com']) EMPLOYEE


В итоге в таблице у меня получается 4 записи:
| survey_id                            | employee            | status  |
|--------------------------------------|---------------------|---------|
| 66c89a34-fff2-4cbc-a542-b1e956a352f3 | NNogerbek@gmail.com | true    |
| 66c89a34-fff2-4cbc-a542-b1e956a352f3 | DJony@gmail.com     | true    |
| 66c89a34-fff2-4cbc-a542-b1e956a352f3 | NNogerbek@gmail.com | false   |
| 66c89a34-fff2-4cbc-a542-b1e956a352f3 | IKim@gmail.com      | false   |


Возможно ли не встравлять в таблицу записи, которые уже присутствуют в таблице? Как вы можете видеть в таблице уже есть идентичные записи по столбцам "survey_id", "employee". Это запись с email "NNogerbek@gmail.com". При этом нужно удалить из таблицы записи, которых не было при INSERT. Это запись с email "DJony@gmail.com" получается. В финале хочу получить такой результат:

| survey_id                            | employee            | status  |
|--------------------------------------|---------------------|---------|
| 66c89a34-fff2-4cbc-a542-b1e956a352f3 | NNogerbek@gmail.com | true    |
| 66c89a34-fff2-4cbc-a542-b1e956a352f3 | IKim@gmail.com      | false   |


Насколько я знаю, есть ON CONFLICT, но я не уверен применим ли он в моем случаи. Точнее для обоих условий.
  • Вопрос задан
  • 124 просмотра
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
Возможно ли не встравлять в таблицу записи, которые уже присутствуют в таблице?

Возможно. Если вы этим знанием свой предметной области поделитесь с СУБД и создадите уникальное ограничение. А скорей всего это вовсе натуральный первичный ключ.

on conflict работает как ни удивительно при конфликте уникальности. Поэтому пока у вас никто не гарантирует уникальность данных - on conflict ничего не сделает.
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
Поскольку INSERT и DELETE в одном запросе не получится, нужна процедуре. В ней можно сделать всё, как у вас написано: удалить из таблицы, добавить отсутствующие.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы