在SQL中引用代码值表

时间:2012-08-09 15:01:06

标签: mysql sql

我刚开始使用MySQL并且有一个简单的问题。我想创建一个“My_Table”表,其中包含一个字段“SEX”。我还想创建一个表“SEX_Values”,其中包含字段“CODE”和“VALUE”,其中0 =男性,1 =女性。所以它看起来像这样。

  My_Table            SEX_Values
  +--------+          +--------+--------+ 
  |  SEX   |          |  CODE  |  VALUE |
  +--------+          +--------+--------+
  |        |          |   0    |  male  |
  +--------+          +--------+--------+
                      |   1    | female |
                      +--------+--------+

我想以某种方式对My_Table中的SEX字段设置约束,以便插入/导入到其中的数据必须与SEX_Values表中的一个代码匹配,如果不匹配,我想抛出一个警告,这样的事情。

  My_Table             SEX_Values
  +--------+           +--------+--------+ 
  |  SEX   |<reference>|  CODE  |  VALUE |
  +--------+           +--------+--------+
  |   1    |  >OK      |   0    |  male  |
  +--------+           +--------+--------+
  |   0    |  >OK      |   1    | female |
  +--------+           +--------+--------+
  |   0    |  >OK
  +--------+
  |   3    |  >Throws Warning
  +--------+

任何帮助都会非常感激,因为我以前没有使用过很多SQL。

4 个答案:

答案 0 :(得分:4)

您所描述的内容称为FOREIGN KEY

本质上,它确保了引用完整性 - 换句话说,您不能插入引用表中不存在的任何内容,也不能从主引用表中仍然存在的任何内容中删除任何内容。

因此,在您的情况下,如果Hermaphrodite中没有My_Table,您就无法将SEX_Values插入male,也无法从SEX_Values删除male ,如果My_Table中仍有{{1}}。

答案 1 :(得分:1)

CREATE TABLE SEX_Values
(
    `CODE` INT NOT NULL,
    `VALUES` VARCHAR(10),
    PRIMARY KEY (`CODE`)   -- !!
);

CREATE TABLE My_Table
(
    SEX INT,
    FOREIGN KEY (SEX) REFERENCES SEX_VALUES(`CODE`)   -- !!
);

答案 2 :(得分:0)

为什么不使用enum type

您可以使用

创建表格
CREATE TABLE my_table(
  sex enum("male", "female") NOT NULL
);

这样你可以像这样插入:

INSERT INTO my_table(`sex`) VALUES("male")

你具有使用字符串的语法优势(我认为这比使用数字代码要清晰得多),MySQL将像使用代码一样优化数据库,并且它将强制执行。

答案 3 :(得分:0)

一个非常简单的解决方案是将sex列的数据类型设置为bit,只接受0,1或null值(MSDN ref.)。

在字段定义中也设置NOT NULL约束,以便排除NULL值。