2
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

4 回答 4

4

第一的

为什么我们需要给一个 CONSTRAINT 一个名字,比如“pk_favorite_food”。其背后的目的和用途是什么?

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

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

第二

是什么REFERENCES意思?

REFERENCESFOREIGN KEY约束中使用的关键字,用于指示该FOREIGN KEY列引用哪个表中的列。阅读有关约束的 MySQL 参考以FOREIGN KEY获取完整的语法细节。在您的示例中,它看起来有点奇怪,因为它出现在自己的行上。真的,它属于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 */
于 2012-11-28T13:36:07.580 回答
1

我一一回复你:

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

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

Q参考是什么意思?

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

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

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

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

于 2012-11-28T13:38:08.050 回答
1

我们需要给 CONSTRAINT 一个名称,因为您的数据库会将它存储在某个地方,而该名称就是您获取它的方式。例如运行:

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

于 2012-11-28T13:38:24.367 回答
1
  1. 名称显示了 CONSTRAINT 的功能,因此以后更容易找出它在做什么(例如 pk 表示它是 PRIMARY KEY,fk 是 FOREIGN KEY)
  2. REFERENCES 表示 FOREIGN KEY 的引用表。这意味着表 'favorite_food' 中的 'person_id' 引用了 person 表中的 'person_id'。这样做的效果是,如果您将数据推送到 favourite_food 表中,则您输入的“person_id”必须存在于“person”表中,否则会出现错误,因此您无法将最喜欢的食物添加到不存在的人中。
  3. 此 CONSTRAINT 意味着,此表中每个条目的 PRIMARY KEY 由“person_id”和“food”列组合而成,因此您始终拥有唯一的人和食物组合,因此一个人只能拥有一种最喜欢的食物
于 2012-11-28T13:38:58.703 回答