2011-03-01 143 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