久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL 8 中如何使用檢查約束

176次閱讀
沒有評論

共計(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é)

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-04發(fā)表,共計(jì)2510字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 雷波县| 津市市| 杨浦区| 杭锦后旗| 柞水县| 紫阳县| 凤台县| 全椒县| 津南区| 晋州市| 南汇区| 沁水县| 布尔津县| 门源| 通榆县| 大城县| 雅安市| 兰州市| 江阴市| 抚宁县| 松原市| 镇巴县| 哈密市| 阳曲县| 玉屏| 阳城县| 吉木萨尔县| 江源县| 锡林郭勒盟| 玉溪市| 镇原县| 赣榆县| 滁州市| 息烽县| 屯门区| 扎赉特旗| 颍上县| 安阳县| 乌鲁木齐县| 漳平市| 邵东县|