Sprawdzenie unikalności

0

Tytuł posta chyba trochę nie bardzo. Bo jak to zrobić, to wiem. Bardziej chyba dotyczy dobrych praktyk.

Baza danych to Postgres, chociaż tutaj to też nie ma zbyt dużego znaczenia.

Mam ja sobie przykładowo taką tabelę:

CREATE TABLE person (
	id SERIAL PRIMARY KEY,
	email TEXT NOT NULL UNIQUE
);

kolumna email jest unikalna.

Dotychczas kiedy chciałem dodać nowy wiersz (nową osobę). Sprawdzałem zawsze przed dodaniem czy wiersz z taką nazwą już istnieje:

SELECT EXISTS(SELECT 1 FROM person WHERE email='[email protected]')

Jeśli istniał, użytkownik dostawał informacje z błędem, że musi wybrać inny email czy coś. Jeśli nie istniał, wiersz był dodawany

No ale ostatnio, tak się zastanawiam, czy nie lepiej po prostu na chama spróbować wsadzić ten nowy wiersz. Jeśli istnieje - to przecież baza danych i tak go nie doda, tylko wywali błędem.

Dla postgresa kod błędu dla unique_violation to 23505. Przechwytuje błąd, sprawdzam czy jego kod to nie 23505, jeśli tak - wysyłam użytkownikowi wiadomość, że ten email jest już zajęty.

Zamiast dwóch zapytań do bazy, mam jedno.

Nie jestem doświadczony w temacie baz danych, więc nie wiem jaka jest ogólna filozofia używania wyjątków.
Na przykład w Pythonie panuje zasada "Easier to Ask Forgiveness than Permission" i wyjątki są bardzo szeroko używane nawet do "nie-wyjątkowych" rzeczy. Ale w językach typu C już jest raczej odwrotnie.

A jak jest dla relacyjnych baz danych? Jak to się robi "po bożemu"?

3

Możliwa jest sytuacja kiedy select zwróci brak użytkownika ale insert już się nie uda, bo użytkownik zostanie utworzony przez inną sesje. Wynika z tego, że weryfikowanie czegokolwiek przez select jest bezcelowe.

0

Zgadzam się z @ralf . select jest bezcelowy. Ile nie zrobisz walidacji wcześniej to ostatecznie i tak w bazie się może rozjechać i chroni Cię tylko unique.
O wiele ciekawszy byłby problem gdybyś chciał wstawić jeśli nie istnieje, a jeśli istnieje to żeby nie rzucało błędu. Niby w każdej sensownej bazie się da, ale zdaje się że każda baza ma do tego inną składnię

1 użytkowników online, w tym zalogowanych: 0, gości: 1