Синтаксис
По-долу е синтаксисът на заявката „Upsert“ ON CONFLICT.
>> ВЪВЕЖДАНЕ В Име на таблица (списък с колони) ВАРУСА (списък с стойности) НА КОНФЛИКТ целево действие;Стартирайте Shell на командния ред на PostgreSQL
За да започнете, стартирайте черупката на командния ред на PostgreSQL от менюто на приложението. Свържете го с необходимия сървър. Въведете името на базата данни, върху която искате да работите. За да работите на друг порт, въведете номера на порта и потребителското име, с което искате да работите. За да продължите с параметрите по подразбиране, оставете интервалите както е и натиснете „Enter“ при всяка опция. Добавете парола за избраното потребителско име и вашата командна обвивка трябва да е готова за използване.
Пример 1:
Сега можем да започнем с „Upsert“ в конфликт. Да предположим, че имате таблица, озаглавена „човек“ в избрана база данни с някои полета, които показват записи на различни лица. Тези записи показват имената на хората, техните възрасти и техните градове и държави. Таблицата е показана по-долу.
>> ИЗБЕРЕТЕ * ОТ човек;
Важно е да знаете как може да възникне грешка или конфликт. Полето на таблицата „id“, което е и първичен ключ, съдържа стойности от 1 до 15. Когато потребителят се опита да вмъкне някои дублиращи се записи в таблицата, възниква конфликт.
Нека опитаме следния оператор INSERT, като вмъкнем записите в таблицата „person“. Тази заявка ще доведе до грешка, тъй като стойността „3“ на полето „id“ вече съществува в таблицата.
>> ВЪВЕДЕТЕ В ЛИЦЕ (идентификатор, име, възраст, град, държава) СТОЙНОСТИ ('3', 'Habib', '45', 'Chakwal', 'Pakistan');
Пример 2: Upsert с клауза ON CONFLICT
Ще използваме клаузата ON CONFLICT, за да избегнем INSERT заявката, която причинява тази грешка поради вмъкване на дублиращите се записи. Командата ON CONFLICT предлага две фрази с различни употреби.
- НАПРАВЕТЕ: Извършвайте операции за преодоляване на конфликта.
- НЕ НИЩО: Избягвайте конфликта, без да правите нищо.
Пример 3: Поставете с клауза НЕ НИЩО
В този пример ще разгледаме клаузата DO NOTHING. Тази клауза уточнява, че при грешка или конфликт няма да се извършва операция. С други думи, тази клауза само ще избегне конфликт или грешка.
И така, нека опитаме същата команда INSERT, която използвахме по-рано за добавяне на дублиращи се записи в таблицата „човек“, с добавени няколко промени. Добавихме клаузата ON CONFLICT, заедно с израза DO NOTHING в тази клауза. Клаузата ON CONFLICT е приложена към уникалната колона „id“. Това означава, че когато потребителят се опита да вмъкне дублираната стойност в колоната „id“, той ще избегне конфликта и няма да направи нищо. Както можете да видите на изображението по-долу, той дори няма да вмъкне новия запис в таблицата, нито ще актуализира предишния запис.
>> ВЪВЕДЕТЕ В лице (идентификатор, име, възраст, град, държава) СТОЙНОСТИ ('3', 'Habib', '45', 'Chakwal', 'Pakistan') ЗА КОНФЛИКТ (id) НЕ НИЩО;
Нека проверим таблицата „човек“ отново за автентичност. Както можете да видите на изображението по-долу, не са направени промени в таблицата.
>> ИЗБЕРЕТЕ * ОТ човек;
Пример 2: Upsert с DO клауза
След това ще разгледаме клаузите ON CONFLICT и DO. Както показва името му, клаузата ___ ще извърши действие при грешка или конфликт, когато дублирана стойност се вмъкне в таблица. Ще използваме същата команда за вмъкване, която използвахме преди, за да вмъкнем дублиращ се запис в таблицата „лице“, с незначителна промяна. Добавихме клаузата ON CONFLICT с клаузата DO вътре в нея. Когато потребителят се опита да вмъкне не уникалната стойност в колоната „id“, той ще извърши действие, за да избегне конфликта. Използвахме клаузата UPDATE след клаузата DO, която показва актуализация на данните в таблицата „човек“. Ключовата дума SET се използва за задаване на стойността на колоната „name“ на новата стойност „Habib“, като се използва ключовата дума EXCLUDED, където „id“ е „3“ в момента. Ако изпълните следната заявка, ще видите, че заявката е изпълнена.
>> ВЪВЕДЕТЕ В лице (идентификатор, име, възраст, град, държава) СТОЙНОСТИ ('3', 'Habib', '45', 'Chakwal', 'Pakistan') ЗА КОНФЛИКТ (id) НАПРАВЕТЕ АКТУАЛИЗИРАНЕ НАСТРОЙКА име = ИЗКЛЮЧЕНО.име;
Записите в таблицата „човек“ трябва да бъдат извлечени, за да се видят промените в горната заявка. Ако изпълните следната заявка в обвивката на командния ред, трябва да видите следващия изход.
>> ИЗБЕРЕТЕ * ОТ човек;Както можете да видите от изхода по-долу, името на лицето е актуализирано на „Habib“, където „id“ е „3.'
Можете също така да актуализирате записите в повече от една колона, като използвате ключовата дума EXCLUDED в клаузата ON CONFLICT на заявката INSERT, както е показано по-долу.
>> ВЪВЕДЕТЕ В лице (идентификатор, име, възраст, град, държава) СТОЙНОСТИ ('3', 'Habib', '45', 'Chakwal', 'Pakistan') ЗА КОНФЛИКТ (id) НАПРАВЕТЕ АКТУАЛИЗИРАНЕ НАСТРОЙКА име = ИЗКЛЮЧЕНО.име, град = ИЗКЛЮЧЕНО.град;
Промените са показани по-долу.
>> ИЗБЕРЕТЕ * ОТ човек;
Заключение
Тази статия ви показа как да използвате PostgreSQL 'Upsert' с клаузата ON CONFLICT, заедно с действията DO и DO NOTHING. След като прочетохме тази статия, се надяваме, че ще ви е по-лесно да разберете как да използвате PostgreSQL 'Upsert.'