Синтаксис
Ниже приводится синтаксис запроса «Upsert» ON CONFLICT.
>> INSERT INTO имя_таблицы (список_столбцов) VALUSE (список_значений) ON CONFLICT целевое действие;Запустить оболочку командной строки PostgreSQL
Для начала запустите оболочку командной строки PostgreSQL из меню приложения. Подключите его к нужному серверу. Введите имя базы данных, над которой вы хотите работать. Чтобы работать с другим портом, введите номер порта и имя пользователя, с которым вы хотите работать. Чтобы продолжить с параметрами по умолчанию, оставьте пробелы как есть и нажимайте «Enter» для каждого варианта. Добавьте пароль для выбранного имени пользователя, и ваша командная оболочка должна быть готова к использованию.
Пример 1:
Теперь мы можем начать с «Upsert» в конфликте. Предположим, у вас есть таблица с названием «человек» в выбранной базе данных с некоторыми полями, которые показывают записи разных лиц. В этих записях указаны имена людей, их возраст, а также их города и страны. Таблица представлена ниже.
>> ВЫБРАТЬ * ОТ человека;
Важно знать, как может возникнуть ошибка или конфликт. Поле таблицы id, которое также является первичным ключом, содержит значения от 1 до 15. Когда пользователь пытается вставить в таблицу несколько повторяющихся записей, возникает конфликт.
Давайте попробуем следующий оператор INSERT, вставив записи в таблицу 'person'. Этот запрос вызовет ошибку, потому что значение '3' поля 'id' уже существует в таблице.
>> ВСТАВИТЬ человека (идентификатор, имя, возраст, город, страна) ЗНАЧЕНИЯ ('3', 'Хабиб', '45', 'Чаквал', 'Пакистан');
Пример 2: Обновление с предложением ON CONFLICT
Мы будем использовать предложение ON CONFLICT, чтобы избежать запроса INSERT, который вызывает эту ошибку из-за вставки повторяющихся записей. Команда ON CONFLICT содержит две фразы с разным употреблением.
- ДЕЛАТЬ: Выполните операции по преодолению конфликта.
- НИЧЕГО НЕ ДЕЛАТЬ: Избегайте конфликта, ничего не делая.
Пример 3: Upsert с предложением DO NOTHING
В этом примере мы рассмотрим предложение DO NOTHING. В этом пункте уточняется, что в случае ошибки или конфликта никакие операции выполняться не будут. Другими словами, этот пункт позволит избежать конфликта или ошибки.
Итак, давайте попробуем ту же команду INSERT, которую мы использовали ранее для добавления повторяющихся записей в таблицу 'person', с добавлением нескольких изменений. Мы добавили предложение ON CONFLICT вместе с оператором DO NOTHING в это предложение. Предложение ON CONFLICT было применено к уникальному столбцу id. Это означает, что когда пользователь пытается вставить повторяющееся значение в столбец id, он избегает конфликта и ничего не делает. Как вы можете видеть на изображении ниже, он даже не будет вставлять новую запись в таблицу и не обновляет предыдущую запись.
>> ВСТАВИТЬ В человека (идентификатор, имя, возраст, город, страна) ЗНАЧЕНИЯ ('3', 'Хабиб', '45', 'Чаквал', 'Пакистан') ПРИ КОНФЛИКТЕ (id) НИЧЕГО НЕ ДЕЛАЙТЕ;
Давайте еще раз проверим таблицу 'person' для достоверности. Как вы можете видеть на изображении ниже, в таблицу не было внесено никаких изменений.
>> ВЫБРАТЬ * ОТ человека;
Пример 2: Upsert с предложением DO
Далее мы рассмотрим предложения ON CONFLICT и DO. Как видно из названия, предложение ___ будет выполнять действие в случае ошибки или конфликта, когда повторяющееся значение вставляется в таблицу. Мы будем использовать ту же команду вставки, которую мы использовали ранее, чтобы вставить повторяющуюся запись в таблицу 'person', с небольшими изменениями. Мы добавили предложение ON CONFLICT с предложением DO внутри него. Когда пользователь пытается вставить неуникальное значение в столбец id, он выполнит действие, чтобы избежать конфликта. Мы использовали предложение UPDATE после предложения DO, которое указывает на обновление данных в таблице 'person'. Ключевое слово SET используется для установки значения столбца name на новое значение, Habib, с помощью ключевого слова EXCLUDED, где id - 3 в текущий момент. Если вы выполните следующий запрос, вы увидите, что запрос был выполнен.
>> ВСТАВИТЬ В человека (идентификатор, имя, возраст, город, страна) ЗНАЧЕНИЯ ('3', 'Хабиб', '45', 'Чаквал', 'Пакистан') ПРИ КОНФЛИКТЕ (id) ОБНОВИТЬ НАБОР имя = ИСКЛЮЧЕНО.название;
Чтобы увидеть изменения в указанном выше запросе, необходимо получить записи из таблицы 'person'. Если вы выполните следующий запрос в оболочке командной строки, вы должны увидеть следующий вывод.
>> ВЫБРАТЬ * ОТ человека;Как видно из вывода ниже, имя человека было обновлено до «Habib», где «id» - «3».'
Вы также можете обновить записи в нескольких столбцах, используя ключевое слово EXCLUDED в предложении ON CONFLICT запроса INSERT, как показано ниже.
>> ВСТАВИТЬ В человека (идентификатор, имя, возраст, город, страна) ЗНАЧЕНИЯ ('3', 'Хабиб', '45', 'Чаквал', 'Пакистан') ПРИ КОНФЛИКТЕ (id) ОБНОВИТЬ НАБОР имя = ИСКЛЮЧЕНО.имя, город = ИСКЛЮЧЕНО.город;
Изменения показаны ниже.
>> ВЫБРАТЬ * ОТ человека;
Заключение
В этой статье показано, как использовать PostgreSQL 'Upsert' с предложением ON CONFLICT, а также действиями DO и DO NOTHING. Мы надеемся, что после прочтения этой статьи вам будет легче понять, как использовать PostgreSQL 'Upsert.'