今天才知道在mysql中check約束是無效的,例如下面一段**,在建立表table1時新增了check約束,要求field1欄位的值大於零,隨後向field1欄位插入-1,這明顯違反check約束,但這段**在mysql中卻可以執行成功。
create table table1
( field1 int,
check (field1 > 0)
);insert into table1 values (-1);
select * from table1;
執行結果:
+--------+
| field1 |
+--------+
| -1 |
+--------+
1 row in set (0.00 sec)
解決這個問題有兩種方式。如果需要設定check約束的字段值離散的,並且能很容易列舉全部可能值,就可以考慮將該字段的型別設定為列舉型別enum()或集合型別set()。比如性別字段可以這樣設定,插入列舉值以外值的操作將不被允許:
create table table1
( gender enum('男', '女')
);insert into table1 values ('秀吉');-- 此次插入操作將失敗
不過enum()型別和set()型別之間還有些小區別,
官方文件上有說明。
如果需要設定check約束的字段是連續的,或者列舉全部值很困難,比如正實數或正整數,那就只能用觸發器來代替約束實現資料有效性了。下面這段**建立了乙個叫做testfield1_beforeinsert的約束器,它將保證新插入的資料中field1欄位的值不小於零。
delimiter $$
create trigger testfield1_beforeinsert before insert on table1
for each row
begin
if new.field1 < 0 then
set new.field1 = 0;
end if;
end$$
Mysql裡check約束無效怎麼辦
今天寫到專案時,遇到了這個問題 msql裡check約束為什麼會無效?具體原因,不清楚,但是我找到了一些解決的辦法 例如下面一段 建立好錶a後,新增check約束,要求a欄位和b欄位的值都大於等於0,隨後向a欄位和b欄位隨意插入 1,2,這明顯違反check約束,但這段 在mysql裡面卻可以執行成...
MySQL的check約束無效怎麼辦?
1.check約束mysql可以使用check約束,但check約束對資料驗證沒有任何作用。create table temp id int auto increment primary key id name varchar 20 age int,check約束 check age 20 上面ch...
MySQL檢查約束(CHECK)
mysql 檢查約束 check 可以通過 create table 或 alter table 語句實現,根據使用者實際的完整性要求來定義。它可以分別對列或表實施 check 約束。檢查約束使用check關鍵字,具體的語法格式如下 check 表示式 其中 表示式 指的就是 sql 表示式,用於指...