2013-03-29 12 views
21

Piszę procedurę rezerwacji dla mock lotniczej bazy danych rezerwacji i to, co naprawdę chcesz robić coś takiego:warunkowego INSERT INTO w PostgreSQL

IF EXISTS (SELECT * FROM LeadCustomer 
    WHERE FirstName = 'John' AND Surname = 'Smith') 
THEN 
    INSERT INTO LeadCustomer (Firstname, Surname, BillingAddress, email) 
    VALUES ('John', 'Smith', '6 Brewery close, 
      Buxton, Norfolk', [email protected]'); 

Ale Postgres nie obsługuje IF wypowiedzi bez ładowanie rozszerzenia PL/pgSQL. Zastanawiam się, czy był jakiś sposób, aby zrobić coś podobnego, czy też w tym kroku będzie musiała nastąpić jakaś interakcja użytkownika?

+0

Dlaczego nie wystarczy załadować rozszerzenie PL/pgSQL, a następnie? –

+0

@MattBall: Praca z instalacją PostgreSQL na komputerach laboratoryjnych. Używanie tego rozszerzenia nie znajduje się w specyfikacji. –

Odpowiedz

45

To specyficzne polecenia można zrobić tak:

insert into LeadCustomer (Firstname, Surname, BillingAddress, email) 
select 
    'John', 'Smith', 
    '6 Brewery close, Buxton, Norfolk', '[email protected]' 
where not exists (
    select * from leadcustomer where firstname = 'John' and surname = 'Smith' 
); 

będzie wstawić wynik select, a select będzie zwrócić tylko wiersz, jeżeli klient nie istnieje.

+1

Zakładam, że jest tu (bardzo mały) wyścig? Wykonywanie wybranych podzapytań, zwraca 0 wierszy, wstawka występuje w innym wątku, a następnie pojawia się wstawka LeadCustomer? –

+0

@Kevin Wyjątek klucza podstawowego zostanie zgłoszony, a aplikacja zdecyduje, co zrobić. –

+1

Jestem zdezorientowany, pytanie nie wspomina o podstawowych kluczach w dowolnym miejscu. Jeśli był klucz podstawowy (imię, nazwisko), dlaczego najpierw nie wypróbowałbyś wkładki? –

1

Począwszy od wersji 9.5 pgsql upsert wliczono korzystania INSERT ... ON CONFLICT DO UPDATE ...

Poniższa odpowiedź nie jest już istotne. Postgres 9.5 został wydany kilka lat później z lepszym rozwiązaniem.

Postgres nie ma funkcji "upsert" bez dodawania nowych funkcji.
Co musisz zrobić, to uruchomić kwerendę wyboru i sprawdzić, czy masz pasujące wiersze. Jeśli to zrobisz, włóż to.

Wiem, że nie chcesz dokładnie wypuścić, ale to prawie to samo.

+0

Istnieje sposób, aby to zrobić: http://stackoverflow.com/a/8702291/330315 –

+0

to będzie nadal zwiększać automatycznie zwiększany identyfikator nawet wtedy, gdy wystąpi konflikt (jak próbuje się wstawić) – rohanagarwal

+0

"Sprawdź wyniki, i warunkowo wstawić "jest podatny na warunki wyścigu: Jeśli masz dwa wątki robiąc to w tym samym czasie, możesz uzyskać dwie wstawki. –

Powiązane problemy