13.1.20.6 CHECK Constraints
Prior to MySQL 8.0.16, CREATE TABLE
permits only the following limited version of table CHECK
constraint syntax, which is parsed and ignored:
CHECK (expr)
As of MySQL 8.0.16, CREATE TABLE
permits the core features of table and column CHECK
constraints, for all storage engines. CREATE TABLE
tillader følgendeCHECK
begrænsningssyntaks for både tabelbegrænsninger og kolonnebegrænsninger:
] CHECK (expr) ENFORCED]
den valgfrisymbol
angiver et navn for begrænsningen. Hvis udeladt, genererer et navn fra tabelnavnet, en bogstavelig _chk_
og et ordinært tal (1, 2, 3,…). Begrænsningsnavne har en maksimal længde på 64 tegn. De er store og små bogstaver, men ikke accent-følsomme.
expr
angiver begrænsningsbetingelsen som et boolsk udtryk, der skal evalueres til TRUE
eller UNKNOWN
(for NULL
værdier) for hver række i tabellen. Hvis tilstanden evalueres til FALSE
, fejler den, og der opstår en begrænsningsovertrædelse. Effekten af en overtrædelse afhænger af den erklæring, der udføres, som beskrevet senere i dette afsnit.
den valgfrie håndhævelsesklausul angiver, om begrænsningen håndhæves:
-
hvis udeladt eller angivet som
ENFORCED
, oprettes og håndhæves begrænsningen. -
Hvis angivet som
NOT ENFORCED
, oprettes begrænsningen, men håndhæves ikke.
aCHECK
begrænsning er angivet som enten en tabelbegrænsning eller kolonnebegrænsning:
-
en tabelbegrænsning vises ikke inden for en kolonnedefinition og kan henvise til enhver tabelkolonne eller kolonner. Fremadrettede referencer er tilladt for kolonner, der vises senere i tabeldefinitionen.
-
en kolonnebegrænsning vises i en kolonnedefinition og kan kun henvise til den kolonne.
overvej denne tabeldefinition:
CREATE TABLE t1( CHECK (c1 <> c2), c1 INT CHECK (c1 > 10), c2 INT CONSTRAINT c2_positive CHECK (c2 > 0), c3 INT CHECK (c3 < 100), CONSTRAINT c1_nonzero CHECK (c1 <> 0), CHECK (c1 > c3));
definitionen inkluderer tabelbegrænsninger og kolonnebegrænsninger i navngivne og unavngivne formater:
-
den første begrænsning er en tabelbegrænsning: den forekommer uden for enhver kolonnedefinition, så den første begrænsning er det kan (og gør) henvise til flere tabelkolonner. Denne begrænsning indeholder fremadrettede referencer til kolonner, der endnu ikke er defineret. Der er ikke angivet noget begrænsningsnavn, så vi genererer et navn.
-
de næste tre begrænsninger er kolonnebegrænsninger: hver forekommer inden for en kolonnedefinition og kan således kun henvise til den kolonne, der defineres. En af begrænsningerne hedder eksplicit. TDC genererer et navn for hver af de to andre.
-
de sidste to begrænsninger er tabelbegrænsninger. En af dem hedder eksplicit. TDC genererer et navn til den anden.
Som nævnt genererer CHECK
begrænsning angivet uden en. For at se de Navne, der er genereret for den foregående tabeldefinition, skal du brugeSHOW CREATE TABLE
:
mysql> SHOW CREATE TABLE t1\G*************************** 1. row *************************** Table: t1Create Table: CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL, `c3` int(11) DEFAULT NULL, CONSTRAINT `c1_nonzero` CHECK ((`c1` <> 0)), CONSTRAINT `c2_positive` CHECK ((`c2` > 0)), CONSTRAINT `t1_chk_1` CHECK ((`c1` <> `c2`)), CONSTRAINT `t1_chk_2` CHECK ((`c1` > 10)), CONSTRAINT `t1_chk_3` CHECK ((`c3` < 100)), CONSTRAINT `t1_chk_4` CHECK ((`c1` > `c3`))) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
standarden angiver, at alle typer begrænsninger (primær nøgle, unikt indeks, fremmed nøgle, check) tilhører samme navneområde. Hver begrænsningstype har sit eget navneområde pr.skema (database). Derfor CHECK
begrænsningsnavne skal være unikke pr. skema; ingen to tabeller i samme skema kan dele et CHECK
begrænsningsnavn. (Undtagelse: aTEMPORARY
tabel skjuler en ikke-TEMPORARY
tabel med samme navn, så det kan have det sammeCHECK
begrænsningsnavne også.)
begyndende genererede begrænsningsnavne med tabelnavnet hjælper med at sikre skemas unikhed, fordi tabelnavne også skal være unikke i skemaet.
CHECK
betingelsesudtryk skal overholde følgende regler. Der opstår en fejl, hvis et udtryk indeholder ikke tilladte konstruktioner.
-
Ikke-genererede Og genererede kolonner er tilladt, undtagen kolonner med attributten
AUTO_INCREMENT
og kolonner i andre tabeller. -
bogstaver, deterministiske indbyggede funktioner og operatører er tilladt. En funktion er deterministisk, hvis flere påkaldelser giver de samme data i tabeller det samme resultat uafhængigt af den tilsluttede bruger. Eksempler på funktioner, der ikke er deterministiske og fejler denne definition:
CONNECTION_ID()
CURRENT_USER()
NOW()
. -
lagrede funktioner og brugerdefinerede funktioner er ikke tilladt.
-
lagrede procedure-og funktionsparametre er ikke tilladt.
-
variabler (systemvariabler, brugerdefinerede variabler og lagrede program lokale variabler) er ikke tilladt.
-
underforespørgsler er ikke tilladt.
Foreign key referential actions (ON UPDATE
ON DELETE
) er forbudt på kolonner, der anvendes iCHECK
begrænsninger. Likewise, CHECK
constraints are prohibited on columns used in foreign key referential actions.
CHECK
constraints are evaluated for INSERT
UPDATE
REPLACE
LOAD DATA
, and LOAD XML
statements and an error occurs if a constraint evaluates to FALSE
. Hvis der opstår en fejl, varierer håndteringen af ændringer, der allerede er anvendt, for transaktions-og ikke-transaktionslagringsmotorer og afhænger også af, om streng kvm-tilstand er i kraft, som beskrevet i streng kvm-tilstand.
CHECK
begrænsninger evalueres forINSERT IGNORE
UPDATE IGNORE
LOAD DATA ... IGNORE
ogLOAD XML ... IGNORE
udsagn og en advarsel opstår, hvis en begrænsning evalueres tilFALSE
. Indsatsen eller opdateringen for enhver krænkende række springes over.
Hvis begrænsningsudtrykket evalueres til en datatype, der adskiller sig fra den deklarerede kolonnetype, sker implicit tvang til den deklarerede type i henhold til de sædvanlige regler for konvertering af typen. Se Afsnit 12.3, “typekonvertering i Ekspressionsevaluering”. Hvis typekonvertering mislykkes eller resulterer i tab af præcision, opstår der en fejl.
Constraint udtryk evaluering bruger KVL-tilstand i kraft på evalueringstidspunktet. Hvis en komponent i udtrykket afhænger af tilstanden KVL, kan der forekomme forskellige resultater for forskellige anvendelser af tabellen, medmindre KVL-tilstanden er den samme under alle anvendelser.