1. 程式人生 > >Mysql中Check約束無效的原因以及解決方法

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

相關推薦

MysqlCheck約束無效原因以及解決方法

首先看下面這段程式碼: 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.3Class '?' 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環境問題弄了兩天,發現網上很多人的帖子要麼複製貼上,要麼就是沒有結貼,還自己寫一句“哈哈,我自己解決了”之類的,這點我就鄙視這些發帖的同胞了,你說你問題問了,問題解決了也不給個解釋。還在搜尋的前幾頁,想沒想過需要答案的人的感受呢。滿心歡喜的去看答案,發現沒有結貼。好吧,不多說,進入正題。 我這種方