Składnia
Poniżej znajduje się składnia zapytania „Upsert” ON CONFLICT.
>> INSERT INTO nazwa_tabeli(lista_kolumny) VALUSE (lista_wartości) ON CONFLICT akcja docelowa;Uruchom powłokę wiersza poleceń PostgreSQL
Aby rozpocząć, uruchom powłokę wiersza poleceń PostgreSQL z menu aplikacji. Podłącz go do wymaganego serwera. Wpisz nazwę bazy danych, nad którą chcesz pracować. Aby pracować na innym porcie, wpisz numer portu i nazwę użytkownika, z którym chcesz pracować. Aby kontynuować z domyślnymi parametrami, pozostaw spacje bez zmian i naciśnij „Enter” przy każdej opcji. Dodaj hasło dla wybranej nazwy użytkownika, a twoja powłoka poleceń powinna być gotowa do użycia.
Przykład 1:
Teraz możemy zacząć od „Upsert” w konflikcie. Załóżmy, że masz w wybranej bazie danych tabelę zatytułowaną „osoba” z polami, które pokazują rekordy różnych osób. Te zapisy zawierają imiona ludzi, ich wiek, miasta i kraje. Tabela jest wyświetlana poniżej.
>> WYBIERZ * OD osoby;
Ważne jest, aby wiedzieć, jak może powstać błąd lub konflikt. Pole tabeli „id”, będące jednocześnie kluczem podstawowym, zawiera wartości od 1 do 15. Gdy użytkownik próbuje wstawić do tabeli kilka zduplikowanych rekordów, pojawia się konflikt.
Wypróbujmy następującą instrukcję INSERT, wstawiając rekordy do tabeli „osoba”. To zapytanie spowoduje błąd, ponieważ wartość „3” pola „id” już istnieje w tabeli.
>> WSTAWIĆ osobę (id, imię, wiek, miasto, kraj) WARTOŚCI ( '3', 'Habib', '45', 'Cakwal', 'Pakistan');
Przykład 2: Upsert z klauzulą ON CONFLICT
Użyjemy klauzuli ON CONFLICT, aby uniknąć zapytania INSERT, które powoduje ten błąd z powodu wstawienia zduplikowanych rekordów. Polecenie ON CONFLICT zawiera dwie frazy o różnych zastosowaniach.
- ZROBIĆ: Wykonaj operacje, aby przezwyciężyć konflikt.
- NIC NIE ROBIĆ: Unikaj konfliktu bez robienia czegokolwiek.
Przykład 3: Upsert z klauzulą NIE RÓB NIC
W tym przykładzie przyjrzymy się klauzuli NIE RÓB NIC. Ta klauzula określa, że żadna operacja nie zostanie wykonana w przypadku błędu lub konfliktu. Innymi słowy, ta klauzula pozwoli tylko uniknąć konfliktów lub błędów.
Wypróbujmy więc to samo polecenie INSERT, którego użyliśmy wcześniej do dodawania zduplikowanych rekordów do tabeli „osoba”, z dołączonymi kilkoma zmianami. Dodaliśmy klauzulę ON CONFLICT wraz z oświadczeniem DO NIC w tej klauzuli. Klauzula ON CONFLICT została zastosowana do unikalnej kolumny „id”. Oznacza to, że gdy użytkownik spróbuje wstawić zduplikowaną wartość do kolumny „id”, uniknie konfliktu i nic nie zrobi. Jak widać na poniższym obrazku, nie wstawi nawet nowego rekordu do tabeli ani nie zaktualizuje poprzedniego rekordu.
>> WSTAWIĆ osobę (id, imię, wiek, miasto, kraj) WARTOŚCI ( '3', 'Habib', '45', 'Cakwal', 'Pakistan') W KONFLIKCIE (id) NIC;
Sprawdźmy jeszcze raz tabelę „osoby” ze względu na autentyczność. Jak widać na poniższym obrazku, w tabeli nie wprowadzono żadnych zmian.
>> WYBIERZ * OD osoby;
Przykład 2: Upsert z klauzulą DO
Następnie przyjrzymy się klauzulom ON CONFLICT i DO. Jak sama nazwa wskazuje, klauzula ___ wykona akcję w przypadku błędu lub konfliktu, gdy do tabeli zostanie wstawiona zduplikowana wartość. Użyjemy tego samego polecenia wstawiania, którego użyliśmy wcześniej do wstawienia zduplikowanego rekordu w tabeli „osoba”, z niewielką zmianą. Dodaliśmy klauzulę ON CONFLICT z klauzulą DO wewnątrz niej. Gdy użytkownik spróbuje wstawić nieunikalną wartość do kolumny „id”, wykona akcję, aby uniknąć konfliktu. Używamy klauzuli UPDATE po klauzuli DO, która wskazuje na aktualizację danych w tabeli „osoba”. Słowo kluczowe SET służy do ustawienia wartości kolumny „name” na nową wartość „Habib”, przy użyciu słowa kluczowego EXCLUDED, gdzie „id” wynosi „3” w bieżącym czasie. Jeśli wykonasz następujące zapytanie, zobaczysz, że zapytanie zostało wykonane.
>> WSTAWIĆ osobę (id, imię, wiek, miasto, kraj) WARTOŚCI ( '3', 'Habib', '45', 'Cakwal', 'Pakistan') W KONFLIKCIE (id) AKTUALIZUJ USTAW imię = WYKLUCZONE.Nazwa;
Aby zobaczyć zmiany w powyższym zapytaniu, należy pobrać rekordy z tabeli „osoba”. Jeśli wykonasz następujące zapytanie w powłoce wiersza poleceń, powinieneś zobaczyć kolejne wyjście:.
>> WYBIERZ * OD osoby;Jak widać z poniższych danych wyjściowych, imię i nazwisko osoby zostało zaktualizowane do „Habib”, gdzie „id” to „3.'
Możesz również zaktualizować rekordy w więcej niż jednej kolumnie, używając słowa kluczowego EXCLUDED w klauzuli ON CONFLICT zapytania INSERT, jak pokazano poniżej.
>> WSTAWIĆ DO osoby (id, imię, wiek, miasto, kraj) WARTOŚCI ( '3', 'Habib', '45', 'Cakwal', 'Pakistan') W KONFLIKCIE (id) AKTUALIZUJ USTAW imię = WYKLUCZONE.nazwa, miasto = WYKLUCZONE.Miasto;
Zmiany są pokazane poniżej.
>> WYBIERZ * OD osoby;
Wniosek
W tym artykule pokazano, jak używać PostgreSQL 'Upsert' z klauzulą ON CONFLICT, wraz z akcjami DO i DO NIC. Mamy nadzieję, że po przeczytaniu tego artykułu łatwiej będzie Ci zrozumieć, jak używać PostgreSQL 'Upsert.'