後記 最近在建立mysql表的時候,對於建表要求給的check
約束不是很清楚,就上網查了一下mysql的check
約束。結果網上的回答通過例項告訴我mysql能接收check
,但接收後不解析,也就是說沒用。
但是自己親手試過之後發現自己的mysql確實能實現check
的約束,這一點就讓我很迷惑。
check約束
我先簡單地描述一下這個check
約束指的是什麼(大佬忽略這一段):
check
約束能為我們提供設定字段限制地簡單方法,就以下例來說明這個東西吧。
#這裡我建一張簡單的學生資訊表
#當前mysql版本8.0.16
#ps: 原諒我喜歡用小寫
create
table student(
sname varchar(10
),sno varchar(8
),*** char(1
),check
(*** in
('f'
,'m'))
);#實際插入一些資料測試
#能插入表中
insert
into student values
('qinkuai'
,'00000000'
,'f');
#不能插入表中
insert
into student values
('qinkuai'
,'00000000'
,'a'
);
附上實際操作的圖,有圖有真相。
支援問題
那這就奇怪了呀,明明不少網友都經過實驗之後得出mysql不支援check
約束的結論了,為什麼還突然就支援了呢。很長一段時間我百思不得其解,後來我想到為什麼不去mysql官方文件看看怎麼說呢。
果然我就看到了這一段。
來自
大概翻譯一下就是
在mysql 8.0.16版本之前的check約束,能被解析但是被忽略掉了,就是寫了也沒用。
而在這個版本上,支援check約束。
之後我一定測試一下之前版本的情況。
所以,作為程式猿,可能當遇到比較複雜不確定的問題的時候,自己動手和查詢官方文件可能會是更好的選擇。
MySQL中CHECK約束無效
今天才知道在mysql中check約束是無效的,例如下面一段 在建立表table1時新增了check約束,要求field1欄位的值大於零,隨後向field1欄位插入 1,這明顯違反check約束,但這段 在mysql中卻可以執行成功。create table table1 field1 int,ch...
SQL檢視CHECK約束資訊
以下兩個語句均基於系統表sysobjects syscomments和系統檢視sysconstraints,查詢結果中包括表id 表名 列id 列名 check約束id check約束名 check約束status值以及check約束的內容,tccview為table column check vi...
SQL檢視CHECK約束資訊
以下兩個語句均基於系統表sysobjects syscomments和系統檢視sysconstraints,查詢結果中包括表id 表名 列id 列名 check約束id check約束名 check約束status值以及check約束的內容,tccview為table column check vi...