共計(jì) 2510 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。
自動(dòng)寫代碼機(jī)器人,免費(fèi)開通
MySQL 8 中如何使用檢查約束,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面丸趣 TV 小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
什么是“檢查約束”?
這是一項(xiàng)新功能,用于指定在插入或更新到一行之前檢查值的條件。如果表的任何行的搜索條件的結(jié)果為 FALSE,則約束可能返回錯(cuò)誤(但如果結(jié)果為 UNKNOWN 或 TRUE,則約束不會(huì)返回錯(cuò)誤)。
此功能開始在 MySQL 8.0.16 上運(yùn)行,在以前的版本中,我們可以創(chuàng)建它,但它不起作用,這意味著支持語法,但不起作用。
要牢記的使用規(guī)則:
AUTO_INCREMENT 自增列不允許使用
引用另一個(gè)表中的另一列不允許使用
存儲(chǔ)的函數(shù)和用戶定義的函數(shù)不允許使用
存儲(chǔ)過程和函數(shù)參數(shù)不允許使用
子查詢不允許使用
在外鍵中用于后續(xù)操作 (ON UPDATE,ON DELETE) 的列不允許使用
為下一條語句 INSERT,UPDATE,REPLACE,LOAD DATA 和 LOAD XML 評估此次監(jiān)測。此外,還會(huì)為 INSERT IGNORE,UPDATE IGNORE,LOAD DATA hellip;IGNORE 和 LOAD XML hellip;IGNORE 評估此監(jiān)測約束。對于這些語句,如果約束的評估結(jié)果為 FALSE,則會(huì)發(fā)生警告。插入或更新被跳過。
看一些例子
我創(chuàng)建了下表來測試此功能。如示例所示,這非常簡單:
CREATE TABLE users ( id int not null auto_increment, firstname varchar(50) not null, lastname varchar(50) not null, age TINYINT unsigned not null CONSTRAINT `check_1` CHECK (age 15), gender ENUM(M , F) not null, primary key (id) ) engine = innodb;
在這個(gè)簡單的測試中,僅當(dāng) age 15 時(shí),我們才能寫入或更新行。
讓我們看一個(gè)示例,嘗試插入 age 15 的行:
mysql INSERT INTO users SET firstname = Name1 , lastname = LastName1 , age = 10, gender = M ERROR 3819 (HY000): Check constraint check_1 is violated.
要?jiǎng)h除,請使用下一個(gè)示例:
ALTER TABLE users DROP CHECK check_1;
讓我們看另一個(gè)示例,向其中添加更多邏輯。我用下一個(gè)檢查表更改了表:
ALTER TABLE users ADD CONSTRAINT gender_male CHECK ( CASE WHEN gender = M THEN CASE WHEN age = 21 THEN 1 ELSE 0 END ELSE 1 END = 1 ); ALTER TABLE users ADD CONSTRAINT gender_female CHECK ( CASE WHEN gender = F THEN CASE WHEN age = 18 THEN 1 ELSE 0 END ELSE 1 END = 1 );
我們添加了更多邏輯,現(xiàn)在它取決于 sex 和 age 列。當(dāng)且僅當(dāng)表行的指定條件評估為 TRUE 或 UNKNOWN(對于 NULL 列值)時(shí),才滿足 CHECK 監(jiān)測約束,否則違反約束。
讓我們從前面的邏輯中看一個(gè)例子。
mysql INSERT INTO users SET firstname = Name2 , lastname = LastName2 , age = 10, gender = F ERROR 3819 (HY000): Check constraint gender_female is violated. mysql INSERT INTO users SET firstname = Name3 , lastname = LastName3 , age = 10, gender = M ERROR 3819 (HY000): Check constraint gender_male is violated.
如您在 ERROR 消息中所見,MySQL 正在顯示 CHECK 約束名稱。可以從應(yīng)用程序源代碼中使用它來調(diào)試錯(cuò)誤并知道從哪個(gè) CHECK 失敗。
最后,這是表結(jié)構(gòu):
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `firstname` varchar(50) NOT NULL, `lastname` varchar(50) NOT NULL, `age` tinyint(3) unsigned NOT NULL, `gender` enum(M , F) NOT NULL, PRIMARY KEY (`id`), CONSTRAINT `gender_female` CHECK (((case when (`gender` = F) then (case when (`age` 18) then 1 else 0 end) else 1 end) = 1)), CONSTRAINT `gender_male` CHECK (((case when (`gender` = M) then (case when (`age` 21) then 1 else 0 end) else 1 end) = 1)) ) ENGINE=InnoDB AUTO_INCREMENT=4;
我們可以使用此功能在表中添加更多的邏輯,但是根據(jù)我以前作為程序員的經(jīng)驗(yàn),我不建議在表中添加邏輯,因?yàn)槌悄鸁o法訪問應(yīng)用程序代碼,否則很難找到或調(diào)試錯(cuò)誤。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝您對丸趣 TV 的支持。
向 AI 問一下細(xì)節(jié)