MySQL中CHECK約束無效

2021-06-12 22:17:19 字數 1123 閱讀 2981

今天才知道在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 表示式,用於指...