Oletame, et PostgreSQL andmebaasis on tabel:
Tootaja_projektis_osalemine (tootaja_projektis_id, alg_aeg, lopp_aeg, projekt_id, tootaja_id, roll_kood)Primaarvõti (tootaja_projektis_id)PostgreSQL EXCLUDE kitsendus on unikaalsuse kitsenduse üldistus. Tabelis on lisaks kaks unikaalsuse kitsendust:
"ex_tootaja_projektis_kattuv_roll_projektis" EXCLUDE USING gist (tootaja_id WITH =, projekt_id WITH =, tstzrange(alg_aeg, lopp_aeg, '[)'::text) WITH &&)"uk_tootaja_projektis_unikaalne_kirje" UNIQUE CONSTRAINT, btree (alg_aeg, projekt_id, tootaja_id, roll_kood)
Esimene kitsendus ütleb, et samal töötajal ei saa olla samas projektis samal ajahetkel rohkem kui üks osalemine. Töötaja ei saa samal perioodil osaleda samas projektis erinevates rollides. See tähendab, et unikaalsuse kitsenduses (2) ei peaks olema veergu roll_kood, sest muidu jõustab see kandidaatvõtme asemel supervõtme. Kitsendus peaks olema selline:
"uk_tootaja_projektis_unikaalne_kirje" UNIQUE CONSTRAINT, btree (alg_aeg, projekt_id, tootaja_id)Kui analüüsida selle unikaalsuse kitsenduse uut versiooni, siis näeme, et see on juba kaetud EXCLUDE kitsendusega. Teiste sõnadega, EXCLUDE kitsendus juba tagab, et tabelis ei saa olla kahte rida, kus on sama tootaja_id, projekt_id ja alg_aeg. See tähendab, et UNIQUE kitsendus on üleliigne ja tuleks andmebaasist eemaldada.
Kas postitus oli kasulik? Hinda seda!
Keskmine hinne: Pole veel hinnanguid!