1

我刚刚开始使用 MySQL 并且有一个快速的问题。我想创建一个包含字段“SEX”的表“My_Table”。我还想创建一个表“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

4 回答 4

4

您所描述的内容称为FOREIGN KEY

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

因此,在您的情况下,如果它仍然存在,则无法插入Hermaphroditein My_Table,也无法从中SEX_Values删除in 。maleSEX_ValuesmaleMy_Table

于 2012-08-09T15:11:59.383 回答
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`)   -- !!
);
于 2012-08-09T15:10:50.017 回答
0

为什么不使用枚举类型

您可以使用创建表

CREATE TABLE my_table(
  sex enum("male", "female") NOT NULL
);

这样你就可以像这样插入:

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

您具有使用字符串的语法优势(我认为这比使用数字代码更清楚),MySQL 将优化数据库,就像您使用代码一样,它会执行。

于 2012-08-09T15:09:45.503 回答
0

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

还要在字段定义中设置NOT NULL约束,以便同时排除 NULL 值。

于 2012-08-09T15:13:54.423 回答