MySQL怎么使用check約束

mysql使用check約束的方法:1、如果要設(shè)置CHECK約束的字段范圍小,并且比較容易列舉全部的值,可以將該字段的類型設(shè)置為enum類型或set類型。2、如果需要設(shè)置CHECK約束的字段范圍大,且列舉全部值比較困難,使用觸發(fā)器來代替約束實現(xiàn)數(shù)據(jù)的有效性了。

MySQL怎么使用check約束

在一些情況下,我們需要字段在指定范圍的輸入,

例如:性別只能輸入 ‘男’或者’女’,余額只能大于0等條件,

例如:可以要求 authors 表的 postcode 列只允許輸入六位數(shù)字的郵政編碼。

我們除了在程序上控制以外,我們還能使用 CHECK 約束 來規(guī)范數(shù)據(jù)。

然而:
mysql所有的存儲引擎均不支持check約束,MySQL會對check子句進行分析,但是在插入數(shù)據(jù)時會忽略,因此check并不起作用。

解決這個問題的兩種方式:

1、如果要設(shè)置CHECK約束的字段范圍小,并且比較容易列舉全部的值,就可以考慮將該字段的類型設(shè)置為枚舉類型 enum()或集合類型set()。

比如性別字段可以這樣設(shè)置,插入枚舉值以外值的操作將不被允許。

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、如果需要設(shè)置CHECK約束的字段范圍大,且列舉全部值比較困難,比如整數(shù)或者某一區(qū)間,那就只能使用觸發(fā)器來代替約束實現(xiàn)數(shù)據(jù)的有效性了。

DELIMITER?$ create?trigger?studentcheck?before?insert?on?Student?for?each?row begin if?new.Age30?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)

可以看出,現(xiàn)在Sex必須在“男”和“女”中選擇,否則插入失敗;當(dāng)年齡不合規(guī)范時,由于觸發(fā)器的存在,會將其自動設(shè)置為默認的20。

由此可以解決check約束無效的問題。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊7 分享