A composite key由多个属性组成,用于唯一标识实体事件.这与复合键的不同之处在于构成键的一个或多个属性本身不是简单键.
例如,您有一个包含CD集合的数据库.其中一个实体称为轨道,它保存CD上轨道的细节.它有一个CD名称,轨道号的复合键.

轨道实体中的CD名称是一个简单的密钥,链接到CD实体,但轨道号本身并不是一个简单的密钥.
假设我们有一个用户表:
+---------+----------+------------+------------+----------------+ | 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列中的值唯一地识别表中的记录:它形成表中的键.据说这些键(在单个列上定义)很简单.
在某些情况下,人们可能知道没有两个用户可以拥有相同的名称,出生日期和邮政编码:那么另一个可能的关键是组合(Surname, Forename, ZIP, DOB).这些键(在多列上定义)被称为复合键.
由于每个记录的密钥必须(根据定义)对它是唯一的,因此可以告诉MySQL UNIQUE通过在相关列上定义索引来强制执行这种唯一性约束(表PRIMARY KEY是特殊类型的UNIQUE索引):尝试创建(或更新)a使用与现有记录相同的密钥记录将失败.
现在假设有一个订单表:
+--------------+-----------+---------+----------+ | Order_number | Status | Total | Customer | +--------------+-----------+---------+----------+ | 12345 | Completed | 1234.99 | ? | | 12346 | Pending | 345.00 | ? | | 12347 | Cancelled | 9876.50 | ? | +--------------+-----------+---------+----------+
我们希望将订单与users表中的相关记录相关联.但是怎么做呢?我们在Customer专栏中放了什么?
显然,我们希望在users表中标识一个唯一的记录,因此我们需要使用其中一个键(Email例如上面的第一个示例).使用一个表的密钥以这种方式从另一个表引用其记录在关系数据库中非常普遍:在这种情况下,我们将引用列称为外键(因为它将键保存到外部表中).
如果我们使用复合键作为参考,我们将有一个复合外键.根据第二个例子,我们的订单表可能有列Customer_Surname,Customer_Forename,Customer_ZIP和Customer_DOB这将一起形成一个外键的用户表(在这种情况下,我不建议这样的架构).
MySQL不仅可以强制执行外键约束(确保引用的记录存在于外表中),而且如果引用的记录本身更新或删除,也可以自动更新或删除引用(orders)表.例如,如果从users表中删除了John,那么他的所有订单都可以从订单表中自动清除(在这种情况下,可能不是人们想要的); 或者如果他的电子邮件地址发生变化,该Customer列可以自动更新.