第一的
为什么我们需要给一个 CONSTRAINT 一个名字,比如“pk_favorite_food”。其背后的目的和用途是什么?
您不需要为约束分配名称,如果您不这样做,MySQL 将在内部为您分配一个名称。它只是一个标识符,这使得以后修改或删除约束更容易。
如果您创建没有该约束名称的表然后 do SHOW CREATE TABLE favodite_food;
,您将看到一个名称与您在上面定义的名称有些相似,但由 MySQL 自动分配。自动创建的标识符可能类似于idx_favorite_food
主键和favorite_food_ibfk_1
约束FOREIGN KEY
。
第二
是什么REFERENCES
意思?
REFERENCES
是FOREIGN 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 */