首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于mysql表创建的几个问题

关于mysql表创建的几个问题
EN

Stack Overflow用户
提问于 2012-11-28 13:28:22
回答 4查看 102关注 0票数 2
代码语言:javascript
复制
CREATE TABLE favorite_food(
    person_id SMALLINT UNSIGNED,
    food VARCHAR(20),
    CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
    CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
    REFERENCES person (person_id)
);

我是MySQL新手,完全来自HTML和JS背景。我这里有几个问题。

  1. 为什么我们需要给一个约束一个像"pk_favorite_food“这样的名字。它背后的目的和用途是什么?
  2. 这些参考资料是什么意思?
  3. CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),为什么我们在这里添加两个列作为主键。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-28 13:36:07

第一

为什么我们需要给一个约束一个像"pk_favorite_food“这样的名字。它背后的目的和用途是什么?

您不需要为约束指定名称,如果没有,MySQL将在内部为您分配一个名称。它只是一个标识符,这使得以后修改或删除约束变得更容易。

如果您创建没有约束名称的表,然后执行SHOW CREATE TABLE favodite_food;,您将看到一个名称与上面定义的名称有些相似,但由MySQL自动分配。自动创建的标识符可能类似于主键的idx_favorite_foodFOREIGN KEY约束的favorite_food_ibfk_1

第二

REFERENCES是什么意思?

REFERENCES是在FOREIGN KEY约束中使用的关键字,用于指示FOREIGN KEY列引用的表中的列。阅读 constraints获得完整的语法细节。在您的示例中,它看起来有点奇怪,因为它出现在自己的行上。实际上,它属于FOREIGN KEY定义。

如果您在它所属的线上看到它,它可能会更清楚一些:

代码语言:javascript
复制
/* REFERENCES is a component of this FOREIGN KEY definition */
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) REFERENCES person (person_id)

第三

CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),为什么我们在这里添加两个列作为主键。

2部分的PRIMARY KEY被称为复合键。当您不需要一个标识列(比如一个自动增量值)时,就可以使用它,但是这两个列的组合在表中必须是唯一的,因此也可以唯一地标识表中的行。因此,在上面的示例中,它强制执行这样一个事实:任何person_id都不能有两行具有相同food的行。

代码语言:javascript
复制
INSERT INTO favorite_food (person_id, food) VALUES (1, 'apples'); /* works */
INSERT INTO favorite_food (person_id, food) VALUES (1, 'bananas'); /* works */
INSERT INTO favorite_food (person_id, food) VALUES (1, 'apples'); /* Fails!  Person 1 already has apples and the pair must be unique */
票数 4
EN

Stack Overflow用户

发布于 2012-11-28 13:38:08

我一个接一个地回答:

Q为什么我们需要给一个约束取一个像"pk_favorite_food“这样的名字。它背后的目的和用途是什么?

--关系模型中的,您应该能够区分所有其他模型中的一行。由于这个原因,您应该选择其值对每一行都是唯一的几个字段。对于该字段的值的组合,您可以确定只有一行将与此值一起捕获。

Q引用是什么意思?

A --这意味着存储在此字段中的值是指向另一个表行的指针。

Q CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),为什么我们在这里添加两个列作为主键。

A,因为在这种情况下,仅使用一个字段是不够的。如果你只包括一个人,这意味着一个人只能吃最喜欢的食物,如果你只吃食物,那就意味着一个食物可以是一个以上的人最喜欢的食物。

注意:这是一个基本的解释,您应该了解关系模型的完整性引用。

票数 1
EN

Stack Overflow用户

发布于 2012-11-28 13:38:24

我们需要给约束一个名称,因为您的数据库会将它存储在某个地方,而这个名称就是您如何获得它的方法。例如,运行:

代码语言:javascript
复制
select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB_NAME'

将显示约束的列表。它们中的每一个都有一个名字,这样你就可以识别它们了。

references关键字用于定义外键关系中使用的表和列。在这种情况下,您喜欢的食物中的person_id引用person表中的person_id。

关于主键,您使用的数字取决于您作为开发人员。

我建议您花一些时间阅读文档,如这里的指南:http://dev.mysql.com/doc/refman/5.0/en/tutorial.html

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

https://stackoverflow.com/questions/13606183

复制
相关文章

相似问题

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