MySQL性别表字段

时间:2012-03-02 13:26:11

标签: mysql

如果我想在表格中创建性别字段,如何确保我的数据库不接受除“M”或“F”之外的任何值?

 $sqlCommand = "CREATE TABLE members (
             id int(11) NOT NULL auto_increment,
             ... 
             ...
             ...
             ...
             gender
             )";

谢谢

4 个答案:

答案 0 :(得分:9)

triggers,没有enums或其他deamonic活动。

您可以将FOREIGN KEY用于仅包含2行的参考表:

CREATE TABLE Gender_Ref 
(   gender CHAR(1) NOT NULL,
    PRIMARY KEY (gender)
) ENGINE = InnoDB ;

INSERT INTO Gender_Ref (gender)
    VALUES
        ('F'), ('M')  ;

CREATE TABLE members 
(   id int(11) NOT NULL auto_increment,
     ... 
     ...
    gender CHAR(1) NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY gender
        REFERENCES Gender_Ref (gender)
) ENGINE = InnoDB ;

“锁定”引用表也是一个很好的建议,因此应用程序代码只具有读访问权限。 (这通常适用于大多数参考表,如果你有一个Admin应用程序,你当然也可以给它提供写入访问权限)。

答案 1 :(得分:5)

与评论中指出的一样,您可以像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引擎管理。这越来越成为标准,所以这不是一个糟糕的选择。

(如果你真的很偏执,你应该确保应用程序只有对性别参考表的读访问权)

答案 2 :(得分:1)

您可以使用enum类型enum('M','F')

答案 3 :(得分:0)

您可以使用触发器检查它是否正确,或者您可以使用枚举类型enum('M','F')