Küsimus
Vastus:
EXCLUDE on PostgreSQLi laiendus - SQL standard seda ette ei näe ja teised andmebaasisüsteemid seda ei paku. Kuid see on väga kasulik laiendus. See on UNIQUE kitsenduse üldistus selles mõttes, et unikaalsuse kontrollimisele saab kasutada väärtuste võrdlemiseks ka muid operaatoreid kui =. Näiteks saab selle abil andmebaasi tasemel deklaratiivsel viisil tagada, et tabelis esitatud ajaliste väärtuste perioodid ei oleks osaliselt ega täielikult kattuvad. Näiteks, kui isikule X on määratud roll Y ajaperioodiks 1. jaanuar 2021 kuni 31. detsember 2021, siis ei saa talle seda sama rolli määrata ajaperioodiks 1. märts 2021 kuni 1. juuni 2021 või 1. märts 2021 kuni 31. detsember 2022. See on "kangem" unikaalsuse kontroll kui UNIQUE (isik_id, rolli_kood, alguse_aeg).
EXCLUDE abil saaks kontrollida ka tavalist unikaalsust, kuid kontrolli töökiiruse (aeglasem kui tavalise UNIQUE kontroll) ja porditavuse (teistesse süsteemide ülekandmise) mõttes pole see hea lahendus. EXCLUDE kitsenduse abil saab realiseerida ka kontrolle, mida muidu tuleks teha (osaliselt) unikaalse indeksiga.
- Tõstutundetu unikaalsus. Näiteks kui tabeli Isik veerus e_meil on juba mingis väljas aadress 'kask@hot.ee', siis ei saa sinna tabelisse lisada aadressi 'Kask@hot.ee'.
- Osaline unikaalsus. Näiteks, aktiivses seisundis kaupade nimetused peavad olema unikaalsed. Kui kaup ei ole aktiivses seisundis, siis selle nimetus ei pea olema unikaalne.
SIIN on EXCLUDE kitsenduse kasutamise koodinäiteid.