在我正在使用的框架的文档中看到这个术语(复合外键)(yii)。什么是复合外键(在 mySql 数据库中)?
(我的猜测是,鉴于两个表之间的关系,一个表的列与另一个表的 id 具有完全相同的名称。)
*免责声明:我进行了尽职调查,并在谷歌上搜索了整整两分钟,但没有找到该术语的确切定义。
假设我们有一个用户表:
+---------+----------+------------+------------+-- --------------+ | 姓氏 | 姓名 | 邮编 | 出生日期 | 电子邮件 | +---------+----------+------------+------------+-- --------------+ | 琼斯 | 约翰 | 60612-0344 | 1970-02-14 | john@jones.com | | 琼斯 | 简 | 60612-0344 | 1971-05-26 | jane@jones.com | | 史密斯 | 萨拉 | 19002-0052 | 1982-06-21 | sara@smith.com | +---------+----------+------------+------------+-- --------------+
因为我们的应用程序要求每个用户都有自己不同的电子邮件地址,所以我们可以通过Email
列中的值来唯一标识表中的记录:它构成了表中的键。这样的键(在单个列上定义)据说是simple。
在某些情况下,人们可能知道没有两个用户可以有相同的姓名、出生日期和邮政编码:那么另一个可能的键是(Surname, Forename, ZIP, DOB)
. 这样的键(定义在多列上)被称为复合键。
由于每条记录的键(根据定义)必须是唯一的,因此可以UNIQUE
通过在相关列上定义索引(表PRIMARY KEY
是一种特殊类型的UNIQUE
索引)来告诉 MySQL 强制执行这种唯一性约束:尝试创建(或更新)一个与现有记录具有相同键的记录将失败。
现在假设有一张订单表:
+--------------+------------+---------+----------+ | 订单号 | 状态 | 总计 | 客户 | +--------------+------------+---------+----------+ | 12345 | 已完成 | 1234.99 | ? | | 12346 | 待定 | 345.00 | ? | | 12347 | 取消 | 9876.50 | ? | +--------------+------------+---------+----------+
我们希望将订单与用户表中的相关记录相关联。但是怎么做呢?我们在Customer
列中放什么?
显然,我们希望在 users 表中标识一条唯一记录,因此我们需要使用其中的一个键(Email
例如上面的第一个示例)。以这种方式使用一个表的键从另一个表中引用其记录在关系数据库中非常普遍:在这种情况下,我们将引用列称为外键(因为它将键保存到外表中)。
如果我们使用复合键作为参考,我们将有一个复合外键。在上面的第二个示例中,我们的 orders 表可能有列Customer_Surname
, Customer_Forename
,Customer_ZIP
和Customer_DOB
它们一起形成 users 表的外键(在这种情况下,我不推荐这样的模式)。
MySQL 不仅可以强制执行外键约束(确保被引用的记录存在于外表中),而且如果被引用的记录本身被更新或删除,也可以自动更新或删除引用(订单)表。例如,如果 John 从 users 表中删除,他的所有订单都可以自动从 orders 表中清除(同样,在这种情况下可能不是人们想要的);或者,如果他的电子邮件地址发生了变化,该Customer
列可以自动更新。
Acomposite key
由多个属性组成,以唯一标识实体出现。这与复合键的不同之处在于组成键的一个或多个属性本身不是简单键。
例如,您有一个保存您的 CD 收藏的数据库。其中一个实体称为轨道,它包含 CD 上轨道的详细信息。这有一个 CD 名称、曲目编号的组合键。
曲目实体中的 CD 名称是一个简单的键,链接到 CD 实体,但曲目编号本身并不是一个简单的键。