Dobro. Imas znaci tabelu (id,ID, shortcode, [broj telefona], [Da li je izvucen]). Dozvoljava se da broj telefona bude u tabeli vise puta. Za svaki [broj telefona] moguce je samo jednom postaviti [Da li je izvucen] na TRUE. Posto je u pitanju MS SQL forum, pretpostavljam da radis u MS SQL pa ce resenje biti primenljivo na MS SQL.
Prvo, MS SQL ne poznaje TRUE/FALSE, MS SQL poznaje 0 i 1 i BIT kolonama. pretpostavljam da je kolona [Da li je izvucen] tipa 'byte'. Predlazem da promenis tip kolone [Da li je izvucen], sa byte na tinyint. Ovako bi definisao kolonu [Da li je izvuce]:
CREATE TABLE NagradnaIgra
(Id... NOT NULL
, ShortCode... NOT NULL
,[broj telefona]... NOT NULL
, [Da li je izvucen] tinyint NOT NULL CHECK ([Da li je izvucen] IN (0,1)) DEFAULT 0
)
Ovim dozvoljavas samo vrednosti 0 i 1, 0 je pocetna vrednost za svaki novi red.
Kako da dozvolis najvise jednu vrednost 1 u koloni [Da li je izvucen]? Ako koristis MS SQL 2008 onda mozes da koristsi filtrirani index, nesto kao
CREATE UNIQUE INDEX SamoJednoIzvlacenje ON NagradnaIgra ([broj telefona],[Da li je izvucen]) WHERE [da li je izvucen]=1
To je sve sto treba da uradis u MS SQL 2008. SQL 2008 dozvoljava WHEER u definiciji indexa, sto jeveoma zgodna stvar
Ako koristis neku raniju verziju MS SQL, ond ne mozes da koristis filtrirani index. Isti efekat se postize kombinovanjem neke identity kolone i kolone [Da li je izvucen]. Recimo da je tvoja kolona Id integer, identity koji pocinje od 1, NOT NULL (ako nije, dodaj jednu takvu identity kolonu i sve sto sledi primeni na tu kolonu).
1) Treba ti UNIQUE index po koloni Id (koja je NOT NULL kolona, ovo je vazno):
CREATE UNIQUE INDEX UniqID ON NagradnaIgra(Id)
2) Zatim, dodaj jednu racunsku kolonu u tabelu, ovako:
ALTER TABLE NagradnaIgra
ADD RacunskaKolona AS (CASE WHEN [da li je izvucen]=1 THEN 0 ELSE Id END)
3) onda dodas ovakav UNIQUE index:
CREATE UNIQUE INDEX UniqueRacunskaKolona ON NagradnaIgra([BrojTelefona],RacunskaKolona)
Gotovo. To je to.
Za sve slucajeve redove koji nisu izvuceni, vrednost RacunskeKolone bice jednaka Id, a to je UNIQUE po celoj tabeli jer je ID jedinstven po celoj tabeli. U slucajevima da je [Da li je izvucen]=1 imamo RacunskaKolona = 0. Kombinacija ([Brojtelefona],RacunskaKolona) bice jednaka na primer (416-123-456,0) i to ce moci da se desi samo jednom za dati broj telefona, zbog indeksa UniqueRacunskaKolona.
Tvoja tabela nece prihvatiti vise od jedne vrednosti 1 u koloni [da li je izvuce] po jednom telefonskom broju. Broj vrednosti 0 u koloni [Da li je izvucen], po svakom telefonskom broju, nije ogranicen.
Nemas potrebe da pises nikakav kod da bi obezbedio "najvise jedna vrednost 1 po telefonu u koloni [da li je izvucen] ".
Sve je u skaldu sa Zidarevom teoremom "The best code is no code at all"
