什么是mysql中的复合外键?

时间:2012-09-02 22:29:31

标签: php mysql html sql yii

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

我的猜测是,考虑到两个表之间的关系,一个表的列名与另一个表的id完全相同。

*免责声明:我做了尽职调查并用Google搜索了整整两分钟,但没有找到该术语的确定定义..

2 个答案:

答案 0 :(得分:6)

composite key 多个属性组成,用于唯一标识实体 。这与复合键的不同之处在于构成键的一个或多个属性本身并不是简单的键。

例如,您有一个包含CD集合的数据库。其中一个实体称为轨道,它保存CD上轨道的细节。它有一个CD名称,曲目编号的复合键。

enter image description here

轨道实体中的CD名称是一个简单的密钥,链接到CD实体,但轨道号本身并不是一个简单的密钥。

答案 1 :(得分:6)

假设我们有一个用户表:

+---------+----------+------------+------------+----------------+
| Surname | Forename | ZIP        | DOB        | Email          |
+---------+----------+------------+------------+----------------+
| 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列中的值唯一标识表中的记录:它会将形成为表。这些键(在单个列上定义)被称为 simple

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

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

现在假设有一个订单表:

+--------------+-----------+---------+----------+
| Order_number | Status    | Total   | Customer |
+--------------+-----------+---------+----------+
|        12345 | Completed | 1234.99 |     ?    |
|        12346 | Pending   |  345.00 |     ?    |
|        12347 | Cancelled | 9876.50 |     ?    |
+--------------+-----------+---------+----------+

我们希望将订单与users表中的相关记录相关联。但是怎么做呢?我们在Customer列中添加了哪些内容?

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

我们是否应该使用复合键作为参考,我们将有一个复合外键。在上面的第二个示例中,我们的订单表可能包含Customer_SurnameCustomer_ForenameCustomer_ZIPCustomer_DOB列,这些列将共同形成用户表中的外键(在这种情况下) ,我不推荐这样的架构。)

MySQL不仅可以强制执行foreign key constraints(确保引用的记录存在于外表中),而且如果引用的记录本身已更新或删除,也可以自动更新或删除引用(订单)表。例如,如果从users表中删除了John,那么他的所有订单都可以从订单表中自动清除(在这种情况下,可能不是人们想要的);或者,如果他的电子邮件地址发生变化,Customer列可能会自动更新。