MySQL關於check約束無效的解決辦法

來源:互聯網
上載者:User

標籤:ota   解決   mysql   ted   sql   creat   duplicate   limit   check   

首先看下面這段MySQL的操作,我建立了一個含有a和b的表,其中a用check約束必須大於0,然而我插入了一條(-2,1,1)的資料,其中a=-2,也是成功插入的。

所以MySQL只是check,但是不強制check。

 1 mysql> create table checkDemoTable(a int,b int,id int,primary key(id)); 2 Query OK, 0 rows affected 3  4 mysql> alter table checkDemoTable add constraint checkDemoConstraint check(age>0); 5 Query OK, 0 rows affected 6 Records: 0  Duplicates: 0  Warnings: 0 7  8 mysql> insert into checkDemoTable values(-2,1,1); 9 Query OK, 1 row affected10 11 mysql> select * from checkDemoTable;12 +----+---+----+13 | a  | b | id |14 +----+---+----+15 | -2 | 1 |  1 |16 +----+---+----+17 1 row in set

 

解決這個問題有兩種辦法:

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。

 1 mysql> create table checkDemoTable(a int,b int,id int,primary key(id)); 2 Query OK, 0 rows affected 3  4 mysql> delimiter ||   5 drop trigger if exists checkTrigger||   6 create trigger checkTrigger before insert on checkDemoTable for each row  7 begin   8 if new.a<=0 then set new.a=1; end if; 9 end||  10 delimiter;11   12 Query OK, 0 rows affected13 Query OK, 0 rows affected14 15 mysql> insert into checkDemoTable values(-1,1,1);16 Query OK, 1 row affected17 18 mysql> select * from checkDemoTable;19 +---+---+----+20 | a | b | id |21 +---+---+----+22 | 1 | 1 |  1 |23 +---+---+----+24 1 row in set

 

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.