首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL性别表字段

问MySQL性别表字段
EN

Stack Overflow用户
提问于 2012-03-02 21:26:11
回答 4查看 22.3K关注 0票数 3

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

代码语言:javascript
复制
 $sqlCommand = "CREATE TABLE members (
             id int(11) NOT NULL auto_increment,
             ... 
             ...
             ...
             ...
             gender
             )";

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-02 21:31:11

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

您可以使用只有2行的引用表的FOREIGN KEY:

代码语言:javascript
复制
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应用程序,当然也可以授予它对引用表的写访问权限)。

票数 11
EN

Stack Overflow用户

发布于 2012-03-02 21:37:32

正如评论中指出的,您可以像这样使用ENUM:

代码语言:javascript
复制
gender ENUM('F','M') NOT NULL

但是,您必须小心,因为这仍然会接受空字符串(尽管您会收到一个警告):

代码语言:javascript
复制
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)设置为更具限制性的值:

代码语言:javascript
复制
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更容易移植到其他RDBMSes。但是,您必须确保这两个表都由InnoDB引擎管理。这正成为越来越多的标准,所以这是一个不错的选择。

(如果你真的是偏执狂,你真的应该确保应用程序只有性别参考表的读取权限)

票数 5
EN

Stack Overflow用户

发布于 2012-03-02 21:28:43

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9534074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档