Mysql中Check約束無效的原因以及解決方法
首先看下面這段程式碼:
mysql> create table ss
-> (
-> no int check(no <= 4 and no >=
-> );
Query OK, 0 rows affected (0.11 sec)
mysql> insert into ss values(1);
Query OK, 1 row affected (0.01 sec)
mysql> select * from ss;
+------+
| no |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> insert into ss values(5);
Query OK, 1 row affected (0.03 sec)
mysql> select * from ss;
+------+
| no |
+------+
| 1 |
| 5 |
+------+
2 rows in set (0.00 sec)
很明顯,CHECK語句在宣告中並未起到作用,為什麼呢?
原因是因為,不同於SQL,在MYSQL中,CHECK只是一段可呼叫但無意義的子句。MySQL會直接忽略。
CHECK子句會被分析,但是會被忽略。
請參見“CREATE TABLE語法”:接受這些子句但又忽略子句的原因是為了提高相容性,以便更容易地從其它SQL伺服器中匯入程式碼,並執行應用程式,建立帶參考資料的表。
解決這個問題有兩種辦法:
1.
如果需要設定CHECK約束的欄位範圍小,並且比較容易列舉全部的值,就可以考慮將該欄位的型別設定為列舉型別 enum()或集合型別set()。比如性別欄位可以這樣設定,插入列舉值以外值的操作將不被允許。
1 mysql> create table checkDemoTable(a enum('男','女'),b int,id int,primary key(id));
2 Query OK, 0 rows affected
3
4 mysql> insert into checkDemoTable values('男',1,1);
5 Query OK, 1 row affected
6
7 mysql> select * from checkDemoTable;
8 +----+---+----+
9 | a | b | id |
10 +----+---+----+
11 | 男 | 1 | 1 |
12 +----+---+----+
13 1 row in set
2.
如果需要設定CHECK約束的欄位範圍大,且列舉全部值比較困難,比如:>0的值,那就只能使用觸發器來代替約束實現資料的有效性了。如下程式碼,可以保證a>0。
CREATE TRIGGER TestField1_BeforeInsert BEFORE INSERT ON checkDemoTable
FOR EACH ROW
BEGIN
IF NEW.a < 0 THEN
SET NEW.a = 0;
END IF;
此外,在MYSQL中,域(Domain)與斷言(Assertion)也是無法使用的,原因類似於CHECK,後續將會在其他文章中提到。更多相關程式碼可以訪問
我的GITHUB
相關推薦
Mysql中Check約束無效的原因以及解決方法
首先看下面這段程式碼: mysql> create table ss -> ( -> no int check(no <= 4 and no >= -> ); Query OK, 0 rows
mysql資料庫 check約束無效
建立table 首先 建立一個數據表Student.欄位id 約束(id > 0).欄位性別 約束為男女。如圖: 插入資料 聰明的你,一定發現裡面的check約束無效。id 為-2 不是id > 0,卻通過了。sex也不是“m
thinkphp3.2.3中Class '?' not found的原因以及解決方法
【來源地址】:自己的個人php論壇 php自學者論壇 【原因】:違反thinkphp的命名規範 例如你的模組名為Home --Home --Controller TestController.class.php (*如
工作中碰到的一些問題以及解決方法
post content 獲取json jquery app div ner htm his 一、左中右布局,左邊定寬,中、右百分比的布局: (1)HTML代碼: <div class="three-left"> </div> <d
20180117MySQL出現Waiting for table metadata lock的原因以及解決方法
存在 ces ldb 環境 gpo open 這就是 理解 而且 轉自http://www.cnblogs.com/digdeep/p/4892953.html 轉自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改) MyS
easyUI datagrid 多行多列數據渲染異常緩慢原因以及解決方法
後端 http 前後端 公司 發送請求 class 之前 vue 做的 原因 最近,在優化之前公司幫聯想(外包)做的一個老的後臺管理系統,由於項目是基於easy UI框架,頁面是後臺用jsp實現的,再加上在公司推行前後端分離的實踐,大部分項目都基於vue采用前後端分離去實現
tcp連接時,BROKEN PIPE錯誤的原因以及解決方法
tcp 技術 sizeof com http 發送消息 spl 系統 alt 問題: 寫了一個server和一個client,UNIX套接字的,server不斷接收消息並打印出來,client是一個交互程序,輸入一個消息回車發送,接著又可以輸入消息。出問題了:當server
死鎖產生的原因以及解決方法
一.什麼是死鎖? 死鎖是由於兩個或以上的執行緒互相持有對方需要的資源,導致這些執行緒處於等待狀態,無法執行。 二.產生死鎖的四個必要條件 1.互斥性:執行緒對資源的佔有是排他性的,一個資源只能被一個執行緒佔有,直到釋放。 2.請求和保持條件:一個執行緒對請求被佔有資源發生阻塞時,對已
移動端網頁布局中需要註意事項以及解決方法總結
lse capi 內置 orm style pac 語法 :active masonry 移動端網頁布局中需要註意事項以及解決方法總結,這份對我們在布局移動端網頁的時候非常有用! winphone系統a、input標簽被點擊時產生的半透明灰色背景怎麽去掉 <
MySQL CPU 使用率高的原因和解決方法(來自aliyun官方文件)
使用者在使用 MySQL 例項時,會遇到 CPU 使用率過高甚至達到 100% 的情況。本文將介紹造成該狀況的常見原因以及解決方法,並通過 CPU 使用率為 100% 的典型場景,來分析引起該狀況的原因及其相應的解決方案。 常見原因 系統執行應用提交查詢(包括資料修改操
SpringBoot專案打成war包在tomcat中啟動兩次原因及解決方法
筆者新建了一個QQ群:571278542 。歡迎大家加入! tomcat重啟兩次的原因是appBase和Context中docBase設定的值導致的,只需要把appBase置為空,docBase寫專案的
Html中產生塌陷的原因及解決方法
產生塌陷的原因:由於沒有給父元素設定寬高,想通過子元素撐開寬高時,子元素又脫離了文件流使得子元素無法撐開文件流 脫離文件流的三種情況: (1)float:給子元素設定浮動 (2)position:absolute;絕對定位 (3)positi
梯度爆炸與梯度消失的原因以及解決方法,區域性極小值問題以及學習率問題(對SGD的改進)
梯度爆炸與梯度消失的原因:簡單地說,根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都小於1的話( ),那麼即使這個結果是0.99,在經過足夠多層傳播之後,誤差對輸入層的偏導會趨於0( )。下面是數學推導推導。假設網路輸出層中的第 個神經元輸出為,而要學習的目標
梯度消失、爆炸產生的原因以及解決方法
梯度消失和梯度爆炸的原因: 1.深度網路:神經網路的反向傳播是逐層對函式偏導相乘,因此當神經網路層數非常深的時候,最後一層產生的偏差就因為乘了很多的小於1的數而越來越小,最終就會變為0,從而導致層數比較淺的權重沒有更新,這就是梯度消失。 梯度爆炸就是由於初始化權值過大,前
transformClassesWithJarMergingForDebug錯誤原因以及解決方法
一、錯誤資訊: Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'. > com.android.build.api.transform.TransformExce
在使用jquery時attr("checked") 返回checked或undefined 原因以及解決方法
問題:在使用jquery時attr("checked") 返回checked或undefined ?演示程式碼如下:<!DOCTYPE html> <html> <head lang="en"> <meta charset="
修改z-index屬性無效原因及解決方法
在CSS中,只能通過程式碼改變層級,這個屬性就是z-index,要讓z-index起作用有個小小前提,就是元素的position屬性要是relative,absolute或是fixed。 (z-index無論設定多高都不起作用情況): 這種情況發生的條件有三個: 1、父標籤 positi
Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request 報錯, 原因以及解決方法
Android studio出現Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"的解決辦法原因 :AS 自帶的gradle 版本太低。 第一步: 下載對的 gredel
iOS 手機照片上傳伺服器方向不對的原因以及解決方法
蘋果手機上傳圖片到伺服器,發現圖片方向不對,實踐發現: 1:原因: 相機拍照後直接取出來的UIimage(用UIImagePickerControllerOriginalImage取出),它本身的imageOrientation屬性是3,即UIImageOrienta
thinkphp框架寫的專案在nginx下無法正常訪問報錯的原因以及解決方法
nginx環境問題弄了兩天,發現網上很多人的帖子要麼複製貼上,要麼就是沒有結貼,還自己寫一句“哈哈,我自己解決了”之類的,這點我就鄙視這些發帖的同胞了,你說你問題問了,問題解決了也不給個解釋。還在搜尋的前幾頁,想沒想過需要答案的人的感受呢。滿心歡喜的去看答案,發現沒有結貼。好吧,不多說,進入正題。 我這種方