MySQL :: MySQL 8.0 Reference Manual :: 13.1.20.6 CHECK Constraints

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 somNOT 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 et navn for enhverCHECK 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 attributtenAUTO_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 UPDATEON 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 INSERTUPDATEREPLACELOAD 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 IGNOREUPDATE IGNORELOAD 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.

Bemærk

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.