关于mysql表创建的几个问题

时间:2012-11-28 13:28:22

标签: mysql

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. 为什么我们需要为CONSTRAINT指定一个名为“pk_favorite_food”的名称。它背后的目的和用途是什么?
  2. 参考文献是什么意思?
  3. CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),为什么我们在这里添加两列作为主键。

4 个答案:

答案 0 :(得分:4)

第一

  

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

您不是必需为约束分配名称,如果不是,MySQL将在内部为您分配一个名称。它只是一个标识符,可以让以后更容易修改或删除约束。

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

第二

  

REFERENCES是什么意思?

REFERENCESFOREIGN KEY约束中使用的关键字,用于指示FOREIGN KEY列引用哪个列的列。阅读the MySQL reference on FOREIGN KEY constraints以获取完整的语法详细信息。在你的例子中,它看起来有点奇怪,因为它出现在它自己的行上。实际上,它属于FOREIGN KEY定义。

如果你在它所属的行上看到它可能会更清楚:

/* 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的行:

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 */

答案 1 :(得分:1)

我一个接一个地回复你:

  

为什么我们需要为CONSTRAINT指定一个名为“pk_favorite_food”的名称。它背后的目的和用途是什么?

A 在关系模型中,您应该能够区分所有其他行中的一行。因此,您应该选择几个字段,其值对于每一行都是唯一的。对于这个字段的值的计算,你可以确定只有一行会捕获这个值。

  

:REFERENCES是什么意思?

A 这意味着存储在此字段中的值是一种指向其他表格行的指针。

  

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

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

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

答案 2 :(得分:1)

我们需要给CONSTRAINT一个名称,因为你的数据库会将它存储在某个地方,而这个名字就是你如何得到它的。例如跑步:

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB_NAME'

将显示约束列表。每个人都有一个名字是有意义的,所以你可以识别它们。

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

关于主键 - 您使用的号码取决于您作为开发人员。

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

答案 3 :(得分:1)

  1. 该名称显示了CONSTRAINT的功能,因此更容易找到它以后的功能(例如pk表示它是PRIMARY KEY,fk是FOREIGN KEY)
  2. REFERENCES表示FOREIGN KEY的引用表。这意味着表'favorite_food'中的'person_id'被引用到person表中的'person_id'。这样做的效果是,如果你将数据推送到favorite_food表中,你输入的'person_id'必须存在于'person'表中,否则你会收到错误,所以你不能将一个喜欢的食物添加到一个不存在的人。
  3. 这个CONSTRAINT意味着,这个表中每个条目的PRIMARY KEY都是列'person_id'和'food'的组合,所以你总是有一个人和食物的独特组合,所以一个人只能有一个最喜欢的食物