Postgres pro standard dokumentáció 9

5.3. korlátozások

Az adattípusok maguk korlátozzák a táblában tárolható adatokat. Azonban sok alkalmazás esetén az ilyen korlátozások túlságosan nyersek. Például egy termék árát tartalmazó oszlop valószínűleg csak pozitív értékeket vehet fel. De nincs ilyen szabványos adattípus. Az oszlopadatokat más oszlopokra vagy sorokra is korlátozhatja. Például a termékinformációkat tartalmazó táblázatban csak egy sor lehet egy adott termékkóddal.

Az ilyen problémák megoldásához az SQL lehetővé teszi az oszlopok és táblák korlátozásának meghatározását. A korlátozások lehetővé teszik, hogy az adatokat a táblázatokban a kívánt módon kezelje. Ha a felhasználó megpróbál tárolni egy értéket az oszlopban, amely sérti a korlátozásokat, hiba lép fel. Korlátozások érvényesek, még akkor is, ha ez az alapértelmezett érték.

5.3.1. Korlátozások ellenőrzési

A korlátozás-ellenőrzés a leggyakoribb kényszerfajták. Definíciójában megadhatja, hogy az oszlop értéke megegyezzen egy logikai kifejezéssel (igazság-hitelesítés). Például az áruk ára a pozitív értékekre korlátozható, az alábbiak szerint:

Amint láthatja, a korlátozás az adattípus után történik, mint az alapértelmezett érték. Az alapértelmezett értékek és korlátozások bármilyen sorrendben megadhatók. A korlátozás-ellenőrzés a CHECK-kulcsszóból áll. amelyet zárójelben lévő kifejezés követ. Ennek a kifejezésnek tartalmaznia kell egy oszlopot, amelyre a korlátozás szerepel, különben nincs sok értelme.

Neveket is rendelhet a kényszerhez. Ez javítja a hibaüzeneteket, és lehetővé teszi, hogy hivatkozzon erre a korlátozásra, ha módosítani szeretné. Ezt így teheti:

Vagyis egy megnevezett korlátozás létrehozásához írja le a CONSTRAINT kulcsszót. majd az azonosítót és magát a korlátozást. (Ha nem határozza meg a korlátozási nevet ilyen módon, a rendszer kiválaszt egy nevet.)

A korlátozás-ellenőrzés több oszlopra is utalhat. Például, ha rendszeres árat és kedvezményes árat tart, garantálja, hogy a kedvezményes ár mindig a szokásosnál alacsonyabb lesz:

Az első két korlát hasonló módon van meghatározva, de a harmadik egy új szintaxist használ. Nem kapcsolódik egy adott oszlophoz, de a lista egy egyedi eleme. Az oszlop definíciói és a korlátozások ilyen definíciói bármilyen sorrendben átrendezhetők.

Az első két korlátozásnál azt mondhatjuk, hogy ezek oszlopkorlátok, míg a harmadik egy táblázati korlát, mivel az az oszlopdefinícióktól elkülönítve van írva. Oszlopmegszorításokat is felírható, mint táblakorlátozása, míg az ellenkezője nem mindig lehetséges, mivel ez azt jelenti, hogy egy oszlop megszorítás kifejezés csak a megfelelő oszlop. (. Bár Postgres Pro nem igényel, de a kompatibilitás más adatbázis-kezelő rendszerek a legjobb követni ezt a szabályt) korábban eredményezte például átírható így:

Neveket is rendelhet a táblázati korlátokhoz ugyanúgy, mint az oszlopkorlátok:

Meg kell jegyezni, hogy a constraint-ellenőrzés teljesül, ha a kifejezés igaz vagy NULL. Mivel számos NULL operandusú kifejezés eredménye NULL, ezek a korlátozások nem akadályozzák meg, hogy a NULL a hozzá tartozó oszlopokra íródjon. Annak érdekében, hogy az oszlop NULL értéket ne tartalmazzon, használhatja a következő szakaszban leírt NOT NULL korlátot.

5.3.2. NOT NULL Korlátozások

A NOT NULL korlátozás egyszerűen azt jelenti, hogy az oszlop nem állítható NULL értékre. Szintaxis példa:

A NOT NULL korlátozás mindig oszlopkorlátként íródott, és funkcionálisan egyenértékű az CHECK kényszerrel (oszlopnév IS NOT NULL). de a Postgres Pro esetében az explicit NOT NULL kényszer hatékonyabban működik. Bár ez a rekordnak hátrányai vannak - nem adhat nevet az ilyen korlátozásoknak.

Természetesen egy oszlophoz több kényszer határozható meg. Ehhez egyszerűen meg kell jelölni egymás után:

A megrendelés itt nem számít, nem feltétlenül felel meg a kényszerellenőrzés sorrendjének.

A NEM NULL értékének korlátozása mellett fordított: NULL korlát. Ez nem azt jelenti, hogy egy oszlopnak csak NULL értékűnek kell lennie, ami természetesen értelmetlen lenne. A lényege egyszerűen meg kell adni, hogy az oszlop értéke NULL (ez az alapértelmezett viselkedés). A NULL korlátozás nincs az SQL szabványban, és nem használható hordozható alkalmazásokban. (Azt hozzá a Postgres Pro csak kompatibilitás más adatbázis-rendszereket.) Azonban néhány felhasználó szeretné használni, mert lehetővé teszi, hogy könnyen válthat a korlátozások a forgatókönyvet. Például elkezdheti:

majd helyezze be a NOT kulcsszót. ahol szükséges.

Adatbázisok tervezésekor leggyakrabban a legtöbb oszlopot NOT NULL feliratú címkével kell ellátni.

5.3.3. Az egyediség korlátozása

Az egyedi korlátok biztosítják, hogy egy adott oszlopban vagy oszlopcsoportban lévő adatok egyediek a táblázat összes sorában. A korlátozás a következőképpen szól:

oszlopkényszer formájában, és így:

táblázati kényszer formájában.

Az oszlopcsoport egyedi korlátozásának megadásához táblázati korlátként írja be az oszlopneveket oszlopokkal elválasztva:

Egy ilyen korlátozás azt jelzi, hogy a felsorolt ​​oszlopok értékeinek kombinációja egyedinek kell lennie a táblázat egészében, míg az egyes oszlopok értékeinek külön nem (és általában nem) egyedinek kell lenniük.

A névhez a szokásos módon egyedi korlátot rendelhet:

Ha egyedi korlátot ad meg, automatikusan létrejön egy egyedi B-tree index a kényszerben felsorolt ​​oszlopok vagy oszlopcsoportok számára. Az egyediségességi feltétel, amely csak bizonyos sorokra vonatkozik, nem írható meg egyedülálló kényszerként, de ehhez egy egyedi részindex létrehozásával is beállíthatja az ilyen feltételeket.

Általánosságban elmondható, hogy az egyedi korlátot megszegik, ha a táblában több sor található, amelyek ugyanolyan értékeket tartalmaznak a kényszerben szereplő összes oszlopban. Azonban a két NULL értéket soha nem tekintik egyenlőnek az összehasonlítás során. Ez azt jelenti, hogy ha létezik egy egyedi korlátozás a táblázatban, a sorokat dupla értékkel mentheti, ha NULL-t tartalmaz egy vagy több kényszeroszlopban. Ez a viselkedés megfelel az SQL szabványnak, de hallottunk olyan DBMS-ekről, amelyek másképp viselkednek. Tartsa szem előtt ezt a funkciót hordozható alkalmazások fejlesztésekor.

5.3.4. Elsődleges kulcsok

Az elsődleges kulcskorlátozás azt jelenti, hogy az oszlop vagy oszlopcsoport, amely létrehozza azt, lehet egy egyedi sor azonosító a táblázatban. Ehhez az értékek mind egyediak, mind NULL-tól eltérőek. Így a következő két definíciójú táblázatok ugyanazokat az adatokat vesznek fel:

Az elsődleges kulcsok több oszlopot tartalmazhatnak; a szintaxis hasonló az egyedi korlátok rekordjához:

Elsődleges kulcs hozzáadásakor automatikusan létrejön egy egyedi B-tree index az elsődleges kulcsban szereplő oszlopokhoz vagy oszlopcsoportokhoz, és ezek az oszlopok NOT NULL jelöléssel vannak megjelölve.

A táblázat legfeljebb egy elsődleges kulcsot tartalmazhat. (Unique megszorítások és korlátozások NOT NULL, amelyek funkcionálisan szinte egyenértékű az elsődleges kulcsokat lehet bármilyen, de rendelni elsődleges kulcs megszorítás csak egy lehet.) Elmélet relációs adatbázisok az elsődleges kulcsot kell lennie minden asztalnál. A Postgres Pro nem rendelkezik ilyen szigorú követelményekkel, de általában jobb követni.

Az elsődleges kulcsok mind a dokumentációban, mind az ügyfélalkalmazásokban hasznosak. Például az asztal tartalmának szerkesztési képességével rendelkező grafikus alkalmazásnak ismernie kell a tábla elsődleges kulcsát, hogy egyértelműen azonosítsa a sorokat. Az elsődleges kulcsok más alkalmazásokat is találnak a DBMS-ben; különösen a tábla elsődleges kulcsa határozza meg a táblázatot erre hivatkozó harmadik fél kulcsainak alapértelmezett céloszlopait.

5.3.5. Külföldi kulcsok

Az idegen kulcskorlátozás meghatározza, hogy az oszlop (vagy oszlopcsoport) értékeinek meg kell egyezniük a másik táblázat bizonyos soraiban szereplő értékekkel. Ezt két csatolt táblázat referenciális integritásának nevezik.

Hagyja, hogy már van olyan termékcsalád, amelyet korábban már használtak:

Tegyük fel, hogy rendelkezel asztalral, amely megrendeli ezeket a termékeket. Azt akarjuk, hogy a rendelési táblázat csak a valóban meglévő termékekre vonatkozó megrendeléseket tartalmazza. Ezért meghatározzuk a terméktáblára hivatkozó külföldi kulcskorlátot:

Ezzel a korlátozással hozhat létre rendelést a product_no értékkel. amely nem szerepel a terméktáblázatban (és nem egyenlő NULL-val), lehetetlen lesz.

Ilyen rendszerben a megbízások tábláját slave táblázatnak nevezik, és a termékeket fő táblának nevezik. Ennek megfelelően az oszlopokat az alárendelt és a fő (vagy hivatkozó és cél) oszlopnak nevezzük.

Az előző parancs az alábbiak szerint rövidíthető:

azaz ha elhagyja az oszlopok listáját, akkor az idegen kulcsot implicit módon társítani fogják a fő asztal elsődleges kulcsához.

Az idegen kulcs hivatkozhat oszlopcsoportra is. Ebben az esetben normál asztali kényszer formájában kell megírni. Például:

Természetesen a korlátozás oszlopainak száma és típusa megegyezik a céloszlopok számával és típusával.

Megadhat egy nevet az idegen kulcskorlátnak a szokásos módon.

A táblázat számos külföldi kulcskorlátot tartalmazhat. Ez hasznos az asztalok sok-sokhoz kapcsolásához. Tegyük fel, hogy van termék- és rendelési táblázata, de azt szeretné, ha egy megrendelés több terméket tartalmaz (ami az előző rendszerben nem lehetséges). Ehhez használhatja ezt a sémát:

Vegye figyelembe, hogy az utolsó táblázat az elsődleges kulcsot idegen kulcsokat tartalmazza.

Tudjuk, hogy a külföldi kulcsok tiltják olyan megrendelések létrehozását, amelyek nem kapcsolódnak semmilyen termékhez. De mi van akkor, ha a megrendelések létrehozása után egy bizonyos termékkel szeretnénk törölni? Az SQL megbirkózik ezzel a helyzetgel. Az intuíció a következő viselkedéseket javasolja:

Tiltja a termék eltávolítását
  • Törölje a kapcsolódó megrendeléseket is
  • Az illusztráció érdekében hajtsa végre a fenti példában a következő viselkedést: amikor megpróbálunk törölni egy megrendeléssel hivatkozott terméket (a order_items táblázat alapján), tiltjuk ezt a műveletet. Ha valaki megpróbál törölni egy rendelést, akkor annak tartalmát törli:

    A korlátozó és a lépcsőzetes deléciók a két leggyakoribb változat. A RESTRICT megakadályozza a linkelt karakterlánc eltávolítását. NINCS ACTION azt jelenti, hogy ha függő vonalak továbbra is fennállnak egy korlátozás ellenőrzésénél, hiba történik (ez az alapértelmezett viselkedés). (A két különbség közül a fő különbség az, hogy a NINCS ACTION lehetővé teszi a tranzakció ellenőrzésének elhalasztását, és a RESTRICT nem.) A CASCADE azt jelzi, hogy a kapcsolódó sorok törlésekor a függő is automatikusan törlődik. Két lehetőség közül választhat: SET NULL és SET DEFAULT. A kapcsolódó sorok törlésekor a NULL értékeket vagy az alapértelmezett értékeket az alárendelt táblázat függő oszlopaihoz rendelheti hozzá. Ne feledje, hogy ez nem lehet a korlátozások megsértésének oka. Például, ha a művelet SET DEFAULT értékre van állítva. Az alapértelmezett érték azonban nem felel meg az idegen kulcskorlátozásnak, a művelet sikertelen lesz.

    Az ON TÖRLÉShöz hasonlóan, BE UPDATE van. amely a megadott oszlop megváltoztatásakor aktiválódik. A lehetséges műveletek megegyeznek, és a CASCADE ebben az esetben azt jelenti, hogy a kapcsolt oszlopok megváltozott értékei át lesznek másolva a függő sorokra.

    5.3.6. Korlátozások a kizárás

    Az eltérési korlátok biztosítják, hogy ha összehasonlítja a megadott oszlopok vagy kifejezések bármelyik két sorát a megadott operátorokkal, az összehasonlítások közül legalább az egyik hamis vagy NULL értéket ad vissza. Így van így: