Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Azure SQL Felügyelt Példány
SQL-adatbázis a Microsoft Fabricben
UNIQUE
korlátozások és CHECK
kényszerek két típusú kényszer, amelyek az SQL Server-táblák adatintegritásának kikényszerítésére használhatók. Ezek fontos adatbázis-objektumok.
Ez a cikk a következő szakaszokat tartalmazza.
EGYEDI korlátozások
A korlátozások olyan szabályok, amelyeket az SQL Server adatbázismotorja kényszerít Önnek. Például UNIQUE
megkötések használatával gondoskodhat arról, hogy ne legyenek ismétlődő értékek olyan oszlopokban, amelyek nem vesznek részt az elsődleges kulcsban. Bár a UNIQUE
kényszer és a PRIMARY KEY
kényszer is az egyediséget kényszeríti ki, PRIMARY KEY
kényszer helyett használjon UNIQUE
kényszert, ha nem az elsődleges kulcsot tartalmazó oszlop (vagy oszlopkombináció) egyediségét szeretné kikényszeríteni.
A PRIMARY KEY
korlátozásoktól eltérően UNIQUE
megkötések lehetővé teszik a NULL
értéket. A UNIQUE
kényszerben részt vevő értékekhez hasonlóan azonban oszloponként csak egy null érték engedélyezett. A UNIQUE
kényszerre FOREIGN KEY
kényszer hivatkozhat.
Ha UNIQUE
korlátozást ad hozzá a tábla egy meglévő oszlopához vagy oszlopához, az adatbázismotor alapértelmezés szerint megvizsgálja az oszlopokban lévő meglévő adatokat, hogy minden érték egyedi legyen. Ha egy UNIQUE
kényszert ad hozzá egy ismétlődő értékeket tartalmazó oszlophoz, az adatbázismotor hibát ad vissza, és nem adja hozzá a kényszert.
Az adatbázismotor automatikusan létrehoz egy UNIQUE
indexet a UNIQUE
korlátozás egyediségi követelményének kikényszerítéséhez. Ezért ha ismétlődő sor beszúrására tesz kísérletet, az adatbázismotor hibaüzenetet ad vissza, amely azt jelzi, hogy a UNIQUE
korlátozás megsértődött, és nem adja hozzá a sort a táblához. Ha nincs explicit módon megadva klaszterindex, a rendszer alapértelmezés szerint létrehoz egy egyedi, nem klaszterezett indexet a UNIQUE
korlátozás érvényesítésére.
CHECK-korlátozások
CHECK
korlátozások kényszerítik a tartomány integritását az egy vagy több oszlop által elfogadott értékek korlátozásával. Bármelyik logikai (Boolean) kifejezéssel létrehozhat CHECK
kényszert, amely a logikai operátorok alapján TRUE
vagy FALSE
eredményez. Egy salary
oszlop értéktartománya például korlátozható egy CHECK
korlátozás létrehozásával, amely csak a 15 000 és 100 000 ft közötti adatokat teszi lehetővé. Ez megakadályozza, hogy a fizetések a szokásos fizetési tartományon túl legyenek beírva. A logikai kifejezés a következő lenne: salary >= 15000 AND salary <= 100000
.
Egyetlen oszlopra több CHECK
korlátozást is alkalmazhat. Egyetlen CHECK
korlátozást több oszlopra is alkalmazhat, ha a tábla szintjén hozza létre. Egy többoszlopos CHECK
kényszer használatával például megerősíthető, hogy a USA
country_region
oszlopértékkel rendelkező összes sornak két karakterből álló értéke is van a state
oszlopban. Ez lehetővé teszi, hogy egy helyen több feltétel is be legyen jelölve.
CHECK
kényszerek FOREIGN KEY
kényszerekhez hasonlóak, mivel az oszlopban lévő értékeket szabályozzák. A különbség az, hogy hogyan határozzák meg, hogy mely értékek érvényesek: FOREIGN KEY
kényszerek egy másik táblából szerzik be az érvényes értékek listáját, míg CHECK
kényszerek határozzák meg az érvényes értékeket egy logikai kifejezésből.
Vigyázat
Az implicit vagy explicit adattípus-átalakítást tartalmazó korlátozások bizonyos műveletek meghiúsulását okozhatják. A partícióváltás forrásainak minősülő táblákon definiált ilyen korlátozások például egy ALTER TABLE...SWITCH
művelet meghiúsulását okozhatják. Kerülje az adattípus-átalakítást a kényszerdefiníciókban.
A CHECK korlátozások korlátozásai
A CHECK
korlátozások elutasítják azokat az értékeket, amelyek FALSE
-re értékelődnek. Mivel a null értékek ISMERETLEN értéket adnak, a kifejezésekben való jelenlétük felülírhatja a kényszereket. Tegyük fel például, hogy egy int oszlopra MyColumn
korlátozást helyez el, amely azt határozza meg, hogy MyColumn
csak a 10 (MyColumn=10
) értéket tartalmazza. Ha beszúrja a NULL
értéket a MyColumn
-be, akkor az adatbázismotor beszúrja a NULL
-t, és nem ad vissza hibát.
A CHECK
kényszer TRUE
ad vissza, ha az ellenőrzött feltétel nem FALSE
a táblázat egyik sorához sem. A CHECK
kényszer a sor szintjén működik. Ha egy létrehozott tábla nem tartalmaz sorokat, a tábla CHECK
korlátozása érvényesnek minősül. Ez a helyzet váratlan eredményeket hozhat, ahogyan az alábbi példában is látható.
CREATE TABLE CheckTbl (col1 INT, col2 INT);
GO
CREATE FUNCTION CheckFnctn()
RETURNS INT
AS
BEGIN
DECLARE @retval INT;
SELECT @retval = COUNT(*)
FROM CheckTbl;
RETURN @retval;
END;
GO
ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1);
GO
A hozzáadott CHECK
korlátozás azt határozza meg, hogy legalább egy sornak kell lennie a CheckTbl
táblában. Mivel azonban a táblában nincsenek olyan sorok, amelyek alapján ellenőrizni szeretné ennek a kényszernek a feltételét, a ALTER TABLE
utasítás sikeres lesz.
CHECK
korlátozások nem lesznek érvényesítve DELETE
utasítások során. Ezért a DELETE
utasítások bizonyos típusú ellenőrzési korlátozásokkal rendelkező táblákon való végrehajtása váratlan eredményeket eredményezhet. Vegyük például a CheckTbl
táblában végrehajtott alábbi utasításokat.
INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;
A DELETE
utasítás sikeres, annak ellenére, hogy a CHECK
korlátozás azt határozza meg, hogy a tábla CheckTbl
legalább 1
sortal kell rendelkeznie.
Jegyzet
Ha a tábla replikációra van közzétéve, a sémaváltoztatásokat a Transact-SQL utasítással kell végrehajtania, az ALTER TABLE vagy az SQL Server Management Objects (SMO) használatával. Ha a sémamódosítások a Táblatervező vagy az Adatbázisdiagram-tervező használatával történnek, a rendszer megpróbálja elvetni és újra létrehozni a táblát. A közzétett objektumokat nem lehet elvetni, ezért a séma módosítása sikertelen lesz.
Kapcsolódó tevékenységek
Feladat | Cikk |
---|---|
Leírja, hogyan hozhat létre egyedi korlátozást. | Egyedi korlátozások létrehozása |
Az egyedi kényszerek módosításának módját ismerteti. | Egyedi korlátozások módosítása |
Az egyedi kényszerek törlésének módját ismerteti. | Egyedi korlátozások törlése |
Ez a cikk azt ismerteti, hogyan hozhat létre ellenőrzési kényszert. | Ellenőrzési korlátozások létrehozása |
Ez a cikk azt ismerteti, hogyan tilthatja le az ellenőrzési kényszert, ha egy replikációs ügynök adatokat szúr be vagy frissít a táblában. | Ellenőrzési megszorítások letiltása replikációhoz |
Ez a cikk azt ismerteti, hogyan tilthatja le az ellenőrzési korlátozást, amikor adatokat adnak hozzá, frissítenek vagy törölnek egy táblából. | Ellenőrző korlátozások letiltása az INSERT és AZ UPDATE utasításokkal |
Ismerteti, hogyan módosíthatja a kényszerkifejezést, illetve azokat a beállításokat, amelyek engedélyezik vagy letiltják a korlátozást adott feltételek esetén. | Ellenőrzési korlátozások módosítása |
Az ellenőrzési kényszer törlésének módját ismerteti. | Ellenőrzési korlátozások törlése |
Ez a cikk azt ismerteti, hogyan tekintheti meg az ellenőrzési kényszer tulajdonságait. | Egyedi korlátozások és korlátozások ellenőrzése |