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 permite următoareleCHECK sintaxa constrângerii, atât pentru constrângerile tabelului, cât și pentru constrângerile coloanei:

] CHECK (expr) ENFORCED]

opționalsymbol specifică un nume pentru constrângere. Dacă este omis, MySQL generează un nume din numele tabelului, un literal_chk_ și un număr ordinal (1, 2, 3,…). Numele constrângerilor au o lungime maximă de 64 de caractere. Sunt sensibile la majuscule, dar nu sensibile la accent.

expr specifică condiția de constrângere ca expresie booleană care trebuie evaluată laTRUE sauUNKNOWN (pentruNULL valori) pentru fiecare rând al tabelului. Dacă condiția se evaluează la FALSE, aceasta eșuează și apare o încălcare a constrângerii. Efectul unei încălcări depinde de declarația executată, așa cum este descris mai târziu în această secțiune.

clauza de executare opțională indică dacă constrângerea este executată:

  • dacă este omis sau specificat caENFORCED, constrângerea este creată și aplicată.

  • dacă este specificat ca NOT ENFORCED, constrângerea este creată, dar nu este aplicată.

aCHECK constrângerea este specificată fie ca o constrângere de tabel, fie ca o constrângere de coloană:

  • o constrângere de tabel nu apare într-o definiție de coloană și se poate referi la orice coloană sau coloană de tabel. Trimiterile înainte sunt permise coloanelor care apar mai târziu în definiția tabelului.

  • o constrângere de coloană apare într-o definiție de coloană și se poate referi numai la acea coloană.

luați în considerare această definiție a tabelului:

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));

definiția include constrângeri de tabel și constrângeri de coloane, în formate numite și anonime:

  • prima constrângere este o constrângere de tabel: apare în afara oricărei definiții de coloană, deci poate (și nu) se referă la mai multe coloane de tabel. Această constrângere conține trimiteri înainte la coloane care nu au fost încă definite. Nu este specificat niciun nume de constrângere, astfel încât MySQL generează un nume.

  • următoarele trei constrângeri sunt constrângeri de coloană: fiecare apare într-o definiție de coloană și, prin urmare, se poate referi numai la coloana definită. Una dintre constrângeri este denumită în mod explicit. MySQL generează un nume pentru fiecare dintre celelalte două.

  • ultimele două constrângeri sunt constrângeri de tabel. Unul dintre ele este numit în mod explicit. MySQL generează un nume pentru celălalt.

după cum sa menționat, MySQL generează un nume pentru orice CHECK constrângere specificată fără unul. Pentru a vedea numele generate pentru definiția tabelului precedent, utilizați SHOW 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

standardul SQL specifică faptul că toate tipurile de constrângeri (cheie primară, index unic, cheie străină, verificare) aparțin aceluiași spațiu de nume. În MySQL, fiecare tip de constrângere are propriul spațiu de nume pe schemă (bază de date). În consecință, CHECK numele constrângerilor trebuie să fie unice pe schemă; nici două tabele din aceeași schemă nu pot partaja un nume de constrângere CHECK. (Excepție: un tabel TEMPORARY ascunde un tabel non-TEMPORARY cu același nume, deci poate avea aceleași nume de constrângere CHECK.)

începutul numelor de constrângere generate cu numele tabelului ajută la asigurarea unicității schemei, deoarece numele tabelelor trebuie să fie unice în cadrul schemei.

CHECK expresiile condiției trebuie să respecte următoarele reguli. O eroare apare dacă o expresie conține constructe nepermise.

  • coloanele Nongenerate și generate sunt permise, cu excepția coloanelor cu atributulAUTO_INCREMENT și a coloanelor din alte tabele.

  • literali, deterministe built-in funcții, și operatorii sunt permise. O funcție este deterministă dacă, având în vedere aceleași date din tabele, invocațiile multiple produc același rezultat, independent de utilizatorul conectat. Exemple de funcții care sunt nedeterministe și nu reușesc această definiție:CONNECTION_ID()CURRENT_USER()NOW().

  • funcțiile stocate și funcțiile definite de utilizator nu sunt permise.

  • procedura stocată și parametrii funcției nu sunt permise.

  • variabilele (variabile de sistem, variabile definite de utilizator și variabile locale de program stocate) nu sunt permise.

  • subinterogările nu sunt permise.

acțiuni referențiale cheie străină (ON UPDATEON DELETE) Sunt interzise pe coloanele utilizate înCHECK constrângeri. 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. Dacă apare o eroare, manipularea modificărilor deja aplicate diferă pentru motoarele de stocare tranzacționale și netransacționale și depinde, de asemenea, dacă modul SQL strict este în vigoare, așa cum este descris în modul SQL strict.

CHECK constrângerile sunt evaluate pentruINSERT IGNOREUPDATE IGNORELOAD DATA ... IGNORE șiLOAD XML ... IGNORE declarații și un avertisment apare dacă o constrângere evaluează laFALSE. Inserarea sau actualizarea pentru orice rând ofensator este omisă.

dacă expresia de constrângere se evaluează la un tip de date care diferă de tipul de coloană declarat, constrângerea implicită la tipul declarat are loc în conformitate cu regulile obișnuite de conversie a tipului MySQL. A se vedea secțiunea 12.3, „Conversia de tip în evaluarea expresiei”. Dacă conversia de tip eșuează sau duce la o pierdere de precizie, apare o eroare.

notă

evaluarea expresiei constrângerii utilizează modul SQL în vigoare la momentul evaluării. Dacă orice componentă a expresiei depinde de modul SQL, pot apărea rezultate diferite pentru diferite utilizări ale tabelului, cu excepția cazului în care modul SQL este același în timpul tuturor utilizărilor.

Lasă un răspuns

Adresa ta de email nu va fi publicată.