1. 程式人生 > >mysql資料庫 check約束無效

mysql資料庫 check約束無效

建立table

首先 建立一個數據表Student.欄位id 約束(id > 0).欄位性別 約束為男女。如圖:

 建立table

插入資料

插入資料

聰明的你,一定發現裡面的check約束無效。id 為-2 不是id > 0,卻通過了。sex也不是“male”或“female”,也通過了。

為什麼約束無效?

檢視 發現這句話 (檢視官方文件連結需要科學上網)

CHECK
The CHECK clause is parsed but ignored by all storage engines. See Section 1.8.2.3, “Foreign Key Differences”.

這裡寫圖片描述

或者說,*這是MySql的一個bug,**MySql沒有實現這個功能。我說這話是有依據的哦,bug report*, 我截圖一部分看一下

這裡寫圖片描述

如何解決

使用觸發器

這裡寫圖片描述

注意一點:
在MySQL中,BEGIN … END 語句的語法為:

BEGIN
[statement_list]
END

其中,statement_list 代表一個或多個語句的列表,列表內的每條語句都必須用分號(;)來結尾。
而在MySQL中,分號是語句結束的識別符號,遇到分號表示該段語句已經結束,MySQL可以開始執行了。因此,直譯器遇到statement_list 中的分號後就開始執行,然後會報出錯誤,因為沒有找到和 BEGIN 匹配的 END。

這時就會用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思),它是一條命令,不需要語句結束標識,語法為:
DELIMITER new_delemiter
new_delemiter 可以設為1個或多個長度的符號,預設的是分號(;),我們可以把它修改為其他符號,如DELIMITER
在這之後的語句,以分號結束,直譯器不會有什麼反應,只有遇到了$,才認為是語句結束。注意,使用完之後,我們還應該記得把它給修改回來。

參考