mysql中的复合外键是什么


What is a composite foreign key in mysql?

在我使用的框架(yii)的文档中看到这个术语(复合外键)。什么是复合外键(在mySql数据库中)?

我的猜测是,给定两个表之间的关系,一个表有一个与另一个表的id完全相同的列。

*免责声明:我做了尽职调查,在谷歌上搜索了大约两分钟,但没有发现这个词的确切定义。。

假设我们有一个用户表:

+---------+----------+------------+------------+----------------+|姓氏|名字|邮政编码|出生日期|电子邮件|+---------+----------+------------+------------+----------------+|Jones | John | 60612-0344 | 1970-02-14 |john@jones.com||Jones | Jane | 60612-0344 | 1971-05-26 |jane@jones.com||Smith | Sara | 19002-0052 | 1982-06-21 |sara@smith.com|+---------+----------+------------+------------+----------------+

因为我们的应用程序要求每个用户都有自己独特的电子邮件地址,所以我们可以通过Email列中的值来唯一标识表中的记录:它在表中形成。这样的键(在单列上定义)被称为简单

在某些情况下,人们可能知道没有两个用户可以拥有相同的姓名、出生日期和邮政编码:那么另一个可能的密钥是(Surname, Forename, ZIP, DOB)的组合。这样的键(在多列上定义)被称为复合

由于每个记录的键必须(根据定义)是唯一的,因此可以告诉MySQL通过在相关列上定义UNIQUE索引来强制执行这种唯一性约束(表的PRIMARY KEYUNIQUE索引的特殊类型):尝试创建(或更新)与现有记录具有相同键的记录将失败。

现在假设有一个订单表:

+--------------+-----------+---------+----------+|订单编号|状态|总计|客户|+--------------+-----------+---------+----------+|12345|已完成|1234.99|||12346|待定|345.00|||12347|已取消|9876.50||+--------------+-----------+---------+----------+

我们希望将订单与用户表中的相关记录相关联。但是该怎么做呢?我们在Customer列中放了什么?

显然,我们希望在users表中标识一个唯一的记录,因此我们需要使用它的一个键(例如上面第一个示例中的Email)。在关系数据库中,以这种方式使用一个表的键引用另一个表中的记录是非常常见的:在这种情况下,我们将引用列称为外键(因为它将键保存在外表中)。

如果我们使用复合键作为引用,我们将有一个复合外键。在上面的第二个例子中,我们的orders表可能有列Customer_SurnameCustomer_ForenameCustomer_ZIPCustomer_DOB,它们将一起形成users表中的外键(在这种情况下,我不建议使用这样的模式)。

MySQL不仅可以强制执行外键约束(确保引用的记录存在于外键表中),而且如果引用的记录本身被更新或删除,MySQL还可以自动更新或删除引用(订单)表。例如,如果John从users表中删除,那么他的所有订单都可以自动从订单表中清除(同样,在这种情况下,可能不是想要的);或者如果他的电子邮件地址改变,则Customer列可以被自动更新。