MySQL使用check約束的方法:1、如果要設定CHECK約束的欄位範圍小,並且比較容易列舉全部的值,可以將該欄位的類型設為enum型別或set型別。 2.如果需要設定CHECK約束的欄位範圍大,且列舉全部值比較困難,使用觸發器來取代約束實現資料的有效性了。
在某些情況下,我們需要欄位在指定範圍的輸入,
例如:性別只能輸入'男'或'女',餘額只能大於0等條件,
例如:可以要求authors 表的postcode 欄位只允許輸入六位數的郵遞區號。
我們除了在程式上控制以外,我們還能使用 CHECK 約束 來規範資料。
然而:
mysql所有的儲存引擎均不支援check約束,MySQL會對check子句進行分析,但插入資料時會忽略,因此check並不起作用。
解決這個問題的兩種方式:
1、如果要設定CHECK約束的欄位範圍小,並且比較容易列舉全部的值,就可以考慮將此欄位的類型設定為枚舉類型enum()或集合類型set()。
例如性別欄位可以這樣設置,插入枚舉值以外值的操作將不被允許。
CREATE TABLE `Student` ( `Sno` char(8) NOT NULL, `Sname` varchar(10) NOT NULL, `Sex` enum('男','女') NOT NULL DEFAULT '男', `Age` tinyint(4) NOT NULL DEFAULT '20', `Phonenumber` char(12) DEFAULT NULL, `Sdept` varchar(20) NOT NULL, PRIMARY KEY (`Sno`), UNIQUE KEY `Phonenumber` (`Phonenumber`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、如果需要設定CHECK約束的欄位範圍大,且列舉全部值比較困難,例如整數或某一區間,那就只能使用觸發器來取代約束實現資料的有效性了。
DELIMITER $ create trigger studentcheck before insert on Student for each row begin if new.Age<15 or new.Age>30 then set new.Age=20;end if; end $ DELIMITER ;
測試:
mysql> insert into Student(Sno,Sname,Sex,Age,Phonenumber,Sdept) values('5','Joe','m',0,'12345243912','CS'); ERROR 1265 (01000): Data truncated for column 'Sex' at row 1 mysql> insert into Student(Sno,Sname,Sex,Age,Phonenumber,Sdept) values('5','Joe','男',0,'12345243912','CS'); Query OK, 1 row affected (0.00 sec) mysql> select * from Student; +-----+-------+-----+-----+-------------+-------+ | Sno | Sname | Sex | Age | Phonenumber | Sdept | +-----+-------+-----+-----+-------------+-------+ | 4 | nancy | m | 0 | 12345243965 | CS | | 5 | Joe | 男 | 20 | 12345243912 | CS | +-----+-------+-----+-----+-------------+-------+ 2 rows in set (0.00 sec)
可以看出,現在Sex必須在「男」和「女」中選擇,否則插入失敗;當年齡不合規範時,由於觸發器的存在,會將其自動設定為預設的20。
由此可以解決check約束無效的問題。
以上是MySQL怎麼使用check約束的詳細內容。更多資訊請關注PHP中文網其他相關文章!