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 rowbeginif 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 1mysql> 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约束的详细内容。
