polecenie do bazy danych unique

0

Witam, stworzyłem bazę danych, mam już wszystko uzupełnione. Teraz robię różne operacje na bazie. Z perspektywy czasu uznałem, że baza potrzebuje aktualizacji. Np. Mam kolumnę "nazwa" w tabeli "konto" i potrzebuje aby ta nazwa była unikalna, żeby nie można było dodać takiej samej. Posiadam także kolumnę "saldo", która nigdy nie powinna być ujemna. Pracuję w IBExpercie, Firebird 2.5. Są to moje początki dlatego nie wiem gdzie to teraz ustawić.
Czy istnieje taka możliwość: użytkownik może zdobyć różne przedmioty, mam do tego encje w bazie, i chcę aby w kolumnie saldo był wynik tego co miał dotychczas "zasob" + tego co zdobył (nawet kilka razy) nazwa "łup".

0

załóż indeks typu 'unique' z polem ' nazwa' , a aktualizacje tabeli 'saldo' zrób w triggerach

0

rozumiem, tylko nie wiem jak to zrobić :/

1

Najpierw musisz wykonać aktualizację rekordów, które się dublują bo jak masz już dwa rekordy gdzie w polu nazwa masz np wartość "A" (ID =1) i "A" (ID =2 ) to constraint ci się nie utworzy (unique) - załatwiasz to odpowiednim zapytaniem i poleceniem update tabela set nazwa = nazwa + 0 where id = 2.
Constraint zakładasz tak:

ALTER TABLE nazwa_tabeli ADD CONSTRAINT nazwa_constrainta UNIQUE (nazwa_pola_lub_pól);

Następnie robisz taką aktualizację kolumny saldo (mniej więcej coś takiego):

update tabela set saldo = 0 where saldo is null

W kolejnym kroku (ja bym tak zrobił) dodałbym sobie NOT NULL na tej kolumnie saldo i zabezpieczył mechanizmy robiące insert / update tej tabeli aby nie wpisywać null kolumny saldo. Ja zawsze robię takie operacje konkretną procedurą np ADD_USERS i ze wszystkich miejsc w bazie jak chcę dodać usera to wywołuję funkcję/procedurę ADD_USER.

Trigger to ostateczność są plusy takiego rozwiązania ale są też minusy. Ja staram się triggerów nie stosować bo widziałem już potężne systemy oparte o logikę triggerową gdzie na afert insert na danej tabeli było 20-30 różnych triggerów ... dlatego możesz dodać triggera aby w ostateczności zabezpieczył ci tabelę

create trigger nazwa_triggera for nazwa_tabeli
  before insert or update
as
begin
   new.saldo = coalesce(:new.saldo,0);
end

Pisałem wszystko z głowy więc sorry za błędy (nie mam pod ręką Firebirda) ale jak coś to sobie powinieneś poradzić

0

dodałem polecenia i teraz gdy dodaję nowy rekord (taki sam jak już mam) to nie pojawiają się żadne błędy, sprzeciwy itp. więc chyba mi to nie działa
tak samo jak saldo jest liczbą ujemną

0

już wszystko działa, dzięki za pomoc :)

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