就像 cmets 中指出的那样,您可以像这样使用ENUM:
gender ENUM('F','M') NOT NULL
但是,您必须小心,因为它仍然会接受空字符串(尽管您会收到警告):
mysql> create table t (g enum('M','F') not null);
Query OK, 0 rows affected (0.12 sec)
mysql> insert into t values ('M');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t values ('');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'g' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)
mysql> select * from t;
+---+
| g |
+---+
| M |
| |
+---+
2 rows in set (0.00 sec)
为确保不会发生这种情况,您可以考虑将sql_mode (http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html) 设置为更具限制性的值:
mysql> set sql_mode = strict_all_tables;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t values ('');
ERROR 1265 (01000): Data truncated for column 'g' at row 1
但是,您应该调查这是否适合您。许多现有的应用程序(wordpress 等)不喜欢弄乱 sql_mode,所以如果你的代码是那些系统的插件,你想避免设置它。
您可以选择设置 sql_mode 服务器范围或会话范围;第一个选项会更健壮,但需要以非默认方式配置 MySQL,并且可能会影响其他应用程序。打开连接后立即在会话级别设置应该可以正常工作,但会使您的应用程序代码混乱。选择你的毒药。
ypercube 的使用外键的建议也很好,并且比 ENUM 更容易移植到其他 RDBMS。但是,您必须确保您的表都由 InnoDB 引擎管理。这正变得越来越标准,所以这不是一个糟糕的选择。
(如果你真的很偏执,你应该确保应用程序只有对性别参考表的读取权限)