2011-03-01 75 views
0

我有一个简单的mysql表,具有以下属性:Name, Surname, RoleMysql添加约束:强制一个字段获取特定值

我希望角色字段只能获得2个可能的值:SupervisorOperator并导致查询尝试插入与该2值不同的内容时发生错误。

例如,我想下面的查询返回一个错误:

INSERT INTO tablename (name,surname,role) VALUES ('max','power','footballplayer'); 

我尝试设置场RoleENUMSET类型,但它只是将该字段为空,而不是射击和错误: (

回答

2

你需要改变的sql_mode避免插入。

mysql> create table check_values (
    -> id int not null auto_increment primary key, 
    -> name varchar(50), 
    -> role enum ('max','power','fp') 
    ->)engine = myisam; 
Query OK, 0 rows affected (0.01 sec) 

mysql> set sql_mode = ''; 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into check_values (name,role) values ('nick','max'); 
Query OK, 1 row affected (0.00 sec) 

mysql> insert into check_values (name,role) values ('john','other'); 
Query OK, 1 row affected, 1 warning (0.00 sec) 

mysql> show warnings; 
+---------+------+-------------------------------------------+ 
| Level | Code | Message         | 
+---------+------+-------------------------------------------+ 
| Warning | 1265 | Data truncated for column 'role' at row 1 | 
+---------+------+-------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select * from check_values; 
+----+------+------+ 
| id | name | role | 
+----+------+------+ 
| 1 | nick | max | 
| 2 | john |  | 
+----+------+------+ 
2 rows in set (0.00 sec) 

mysql> set sql_mode = 'traditional'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into check_values (name,role) values ('frank','other'); 
ERROR 1265 (01000): Data truncated for column 'role' at row 1 
mysql> select * from check_values; 
+----+------+------+ 
| id | name | role | 
+----+------+------+ 
| 1 | nick | max | 
| 2 | john |  | 
+----+------+------+ 
2 rows in set (0.00 sec) 
+0

所以,我可以在每个需要检查的查询之前使用sql_mode开关......那正是我需要的项目。谢谢。 – fatmatto 2011-03-03 08:22:01

+0

嗨@nick,最后一个错误什么类型的SQLException会抛出一个jdbc驱动程序? – user3290180 2016-01-05 11:33:01

0

你看到任何错误,当您使用枚举,如下所示? http://dev.mysql.com/doc/refman/5.0/en/enum.html

另外一个方法是创建一个查询(典型值)使用允许的角色创建表并创建一个从该表到角色表的外键约束。如果yu在多个地方使用检查约束,或者如果您有更大的值列表进行检查,那将更合适。

MYSQL,我相信,不直接支持检查约束,如果这就是你正在寻找。检查这些链接。

CHECK constraint in MySQL is not working

MySQL and Check Constraints

Using Foreign Keys to replace check constraint

+0

谢谢,我应该在查询之前在本网站上找到答案,因为该链接显示与我的相同的问题。你的解决方案使用一个外键到“角色表”可以工作,但在这种情况下对我来说看起来有点矫枉过正。再次感谢你。 – fatmatto 2011-03-01 15:26:10