mysql check約束無效

來源:互聯網
上載者:User

標籤:

轉自http://blog.csdn.net/maxint64/article/details/8643288

 

今天在mysql中嘗試使用check約束時,才知道在MySQL中CHECK約束是無效的,例如下面一段代碼,在建立表table1時添加了CHECK約束,要求field1欄位的值大於零,隨後向field1欄位插入-1,這明顯違反CHECK約束,但這段代碼在MySQL中卻可以執行成功。

  1. CREATE TABLE table1  
  2. (  
  3.     field1 INT,  
  4.     CHECK (field1 > 0)  
  5. );  
  6. INSERT INTO table1 VALUES (-1);  
  7. SELECT * FROM table1;  

運行結果:

  1. +--------+  
  2. | field1 |  
  3. +--------+  
  4. |     -1 |  
  5. +--------+  
  6. 1 row in set (0.00 sec)  

解決這個問題有兩種方式。如果需要設定CHECK約束的欄位值離散的,並且能很容易列舉全部可能值,就可以考慮將該欄位的類型設定為枚舉類型enum()或集合類型set()。比如性別欄位可以這樣設定,插入枚舉值以外值的操作將不被允許:

  CREATE TABLE table1  
  1. (  
  2.     gender ENUM(‘男‘, ‘女‘)  
  3. );  
  4. INSERT INTO table1 VALUES (‘秀吉‘);-- 此次插入操作將失敗  

不過enum()類型和set()類型之間還有些小區別,官方文檔上有說明。

 

如果需要設定CHECK約束的欄位是連續的,或者列舉全部值很困難,比如正實數或正整數,那就只能用觸發器來代替約束實現資料有效性了。下面這段代碼建立了一個叫做TestField1_BeforeInsert的約束器,它將保證新插入的資料中field1欄位的值不小於零。

  1. DELIMITER $$      
  2.   
  3. CREATE TRIGGER TestField1_BeforeInsert BEFORE INSERT ON table1  
  4. FOR EACH ROW  
  5. BEGIN  
  6.     IF NEW.field1 < 0 THEN  
  7.         SET NEW.field1 = 0;  
  8.     END IF;  
  9. END$$ 

mysql check約束無效

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.