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背景。我在这里有几个问题。
pk_favorite_food
”的名称。它背后的目的和用途是什么?CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
为什么我们在这里添加两列作为主键。答案 0 :(得分:4)
为什么我们需要给CONSTRAINT一个像“pk_favorite_food”这样的名字。它背后的目的和用途是什么?
您不是必需为约束分配名称,如果不是,MySQL将在内部为您分配一个名称。它只是一个标识符,可以让以后更容易修改或删除约束。
如果您创建没有该约束名称的表,然后执行SHOW CREATE TABLE favodite_food;
,您将看到一个与您上面定义的名称有些相似但由MySQL自动分配的名称。自动创建的标识符可能类似于主键的idx_favorite_food
和favorite_food_ibfk_1
约束的FOREIGN KEY
。
REFERENCES
是什么意思?
REFERENCES
是FOREIGN 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)