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 sallii seuraavan CHECK rajoitteen syntaksin sekä taulukon rajoitteiden että sarakkeiden rajoitteiden osalta:

] CHECK (expr) ENFORCED]

valinnainen symbol määrittää rajoitteelle nimen. Jos se jätetään pois, MySQL luo taulukon nimestä nimen, kirjaimellisen _chk_ ja järjestysluvun (1, 2, 3,…). Rajoitusnimien enimmäispituus on 64 merkkiä. Ne ovat kirjainherkkiä, mutta eivät korostusherkkiä.

expr määrittää rajoiteehdon Boolen lausekkeena, jonka on arvioitava TRUE tai UNKNOWNNULL arvot) taulukon jokaiselle riville. Jos ehto arvioidaan FALSE, se epäonnistuu ja tapahtuu rajoitusrikkomus. Rikkomuksen vaikutus riippuu suoritetusta lausumasta, kuten tässä jaksossa on kuvattu.

valinnaisessa täytäntöönpanolausekkeessa ilmoitetaan, onko rajoite pantu täytäntöön:

  • Jos se jätetään pois tai määritellään muotoon ENFORCED, rajoite luodaan ja pannaan täytäntöön.

  • Jos määritelty NOT ENFORCED, rajoite luodaan, mutta sitä ei panna täytäntöön.

a CHECK rajoite on määritelty joko taulukkorajoitukseksi tai sarakerajoitukseksi:

  • taulukkorajoite ei esiinny sarakemääritelmässä ja voi viitata mihin tahansa taulukon sarakkeeseen tai sarakkeisiin. Termiiniviittaukset sallitaan taulukon määritelmässä myöhemmin esiintyviin sarakkeisiin.

  • sarakemääritelmässä esiintyy sarakerajoite, joka voi viitata vain kyseiseen sarakkeeseen.

harkitse tätä taulukon määritelmää:

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

määritelmä sisältää taulukkorajoitukset ja sarakerajoitukset nimetyissä ja nimeämättömissä muodoissa:

  • ensimmäinen rajoitus on taulukkorajoitus: se esiintyy minkä tahansa sarakerajoituksen ulkopuolella, joten se voi (ja ei) viitata useita taulukon sarakkeita. Tämä rajoitus sisältää viittauksia sarakkeisiin, joita ei ole vielä määritelty. Rajoitetta ei ole määritetty, joten MySQL luo nimen.

  • seuraavat kolme rajoitusta ovat sarakerajoituksia: jokainen esiintyy sarakkeen määritelmän sisällä, ja voi siten viitata vain siihen, että sarake on määritelty. Yksi rajoitteista mainitaan erikseen. MySQL luo nimen jokaiselle kahdelle muulle.

  • kaksi viimeistä rajoitusta ovat taulukkorajoituksia. Yksi niistä on nimetty erikseen. MySQL luo toiselle nimen.

kuten mainittiin, MySQL luo nimen mille tahansa CHECK rajoitukselle, joka on määritelty ilman yhtä. Jos haluat nähdä edellisen taulukon määritelmää varten luodut nimet, käytä 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

SQL-standardi määrittää, että kaikki rajoitteet (ensisijainen avain, yksilöllinen indeksi, vierasavain, tarkistus) kuuluvat samaan nimiavaruuteen. MySQL: ssä jokaisella rajoitetyypillä on oma nimiavaruutensa skeemaa kohti (tietokanta). Näin ollen CHECK rajoitenimien tulee olla yksilöllisiä skeemaa kohden; kaksi saman skeeman taulukkoa ei voi jakaa CHECK rajoitenimi. (Poikkeus: TEMPORARY taulukko kätkee ei-TEMPORARY taulukko on samanniminen, joten sillä voi olla myös samat CHECK rajoitenimet.)

alku luotu rajoite nimet taulukon nimi auttaa varmistamaan skeema ainutlaatuisuus, koska taulukon nimet on myös oltava ainutlaatuisia sisällä skeema.

CHECK ehtolausekkeiden tulee noudattaa seuraavia sääntöjä. Virhe tapahtuu, jos lauseke sisältää kiellettyjä konstruktioita.

  • yhdistämättömät ja luodut sarakkeet ovat sallittuja, paitsi sarakkeet, joissa on AUTO_INCREMENT attribuutti ja sarakkeet muissa taulukoissa.

  • Literaalit, deterministiset sisäänrakennetut funktiot ja operaattorit ovat sallittuja. Funktio on deterministinen, jos koska taulukoissa on samat tiedot, useat invokaatiot tuottavat saman tuloksen riippumatta liitetystä käyttäjästä. Esimerkkejä funktioista, jotka eivät ole nondeterministisiä ja jotka eivät täytä tätä määritelmää: CONNECTION_ID()CURRENT_USER()NOW().

  • tallennetut funktiot ja käyttäjän määrittämät funktiot eivät ole sallittuja.

  • Tallennetut Menettely-ja toimintoparametrit eivät ole sallittuja.

  • muuttujia (järjestelmän muuttujat, käyttäjän määrittelemät muuttujat ja tallennetut ohjelman paikalliset muuttujat) ei sallita.

  • Alakertoja ei sallita.

ulkomaiset avaintoiminnot (ON UPDATEON DELETE) on kielletty sarakkeissa, joita käytetään CHECK rajoitteet. 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. Jos tapahtuu virhe, jo sovellettujen muutosten käsittely vaihtelee kaupallisten ja ei-kaupallisten tallennusmoottoreiden osalta ja riippuu myös siitä, onko voimassa tiukka SQL-tila, kuten tiukassa SQL-tilassa on kuvattu.

CHECK rajoitteita arvioidaan INSERT IGNOREUPDATE IGNORELOAD DATA ... IGNORE ja LOAD XML ... IGNORE lausumat ja varoitus tapahtuu, jos rajoite arvioi arvoon FALSE. Lisää tai päivittää mitään rikkonut rivi ohitetaan.

Jos rajoiteilmaisu arvioi ilmoitetusta saraketyypistä poikkeavaan tietotyyppiin, implisiittinen pakottaminen ilmoitettuun tyyppiin tapahtuu tavanomaisten MySQL-tyyppimuunnossääntöjen mukaisesti. KS.12.3 kohta ”tyyppien muuntaminen ilmaisun arvioinnissa”. Jos tyypin muuntaminen epäonnistuu tai johtaa tarkkuuden menetykseen, tapahtuu virhe.

Huomautus

Rajoiteilmaisun arvioinnissa käytetään SQL-moodia, joka on voimassa arviointihetkellä. Jos jokin lausekkeen osa riippuu SQL-moodista, taulukon eri käyttötarkoituksissa voi esiintyä erilaisia tuloksia, ellei SQL-moodi ole sama kaikissa käyttötarkoituksissa.

Vastaa

Sähköpostiosoitettasi ei julkaista.