外键(FOREIGN KEY)约束用于与其他表(称为参照表)中的列(称为参照列)建立连接。通过将参照表中主键所在列或具有唯一性约束的列包含在另一个表(外键表)中,这些列就构成了外键表的外键。当参照表中的参照列更新后,外键表中的外键列也会自动更新,从而保证两个表之间的一致性关系。
以sales数据库中的Product表和Category表为例,如图3-51所示。
CategoryID是Category表的主键,它唯一地标识了每一行Category数据。在Product表中也有CategoryID列,Product.Category
ID是Product表的外键。该外键的作用是保证每个产品的种类都必须在Category表中有记录,并且当Category表中的CategoryID列更新后,Product表中的CategoryID列也会自动更新。
1.使用Transact-SQL语句创建外键约束
创建外键约束的语法格式为:
[ CONSTRAINT constraint_name ] FOREIGN KEY (col_name1[,…n])
REFERENCES table_name(column_name1[,…n])
其中:
col_name1[,…n]:指名要实现外键约束的列。
table_name:参照表表名。
column_name1[,…n]:指名参照表中的参照列。
【例3.40】 若sales数据库中包含Seller表和Customer表。其中Seller表包含SaleID、SaleName等字段,SaleID为主键;Customer表包含CustomerID、Company等字段,CustomerID为主键。创建Orders表,包含OrderID、CustomerID、SaleID和OrderDate 4个字段,CustomerID、SaleID为外键。
CREATE TABLE Orders ( Orderid int PRIMARY KEY, CustomerID char(3) REFERENCES Customer(CustomerID), SaleID char(3) CONSTRAINT fk_saleid REFERENCES Seller(SaleID), OrderDate datetime DEFAULT getdate() )
【例3.41】 修改OrderDetail表,在OrderID字段上创建外键约束。
ALTER TABLE OrderDetail
ADD CONSTRAINT fk_orderid
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID)
注意 当将外键约束添加到一个已有数据的列上时,默认情况下,SQL Server会自动检查表中已有数据,以确保所有的数据和主键保持一致,或者为NULL。但也可以根据实际情况,设置SQL Server不检查现有数据的外键约束,例如:
ALTER TABLE OrderDetail WITH NOCHECK ADD CONSTRAINT fk_orderid FOREIGN KEY (OrderID) REFERENCES Orders(OrderID)
2.使用SQL Server Management Studio创建外键约束
在SQL Server Management Studio下同样可以创建外键约束,仍以Product表和Category表为例,表Products中的外键CategoryID参考Category表中的主键CategoryID,其操作步骤如下:
1)进入SQL Server Management Studio,在左边的“对象资源管理器”窗口中选中需要添加外键约束的表,单击鼠标右键,在弹出的快捷菜单中选择“设计”命令,弹出表设计器窗口。
2)在该窗口中,在上方窗格单击鼠标右键,在弹出的快捷菜单中选择“关系”命令,弹出“外键关系”对话框,如图3-52所示。
3)单击“添加”按钮,系统给出默认的关系名,单击“表和列规范”内容框中右边的省略号按钮,从弹出的“表和列”对话框中选择外键约束的表和列,如图3-53所示。单击“确定”按钮,返回“外键关系”对话框。
4)设置“在创建或重新启用时检查现有数据”为“是”,指定对于在创建或重新启用约束之前就存在于表中的所有数据,根据约束进行验证。
5)将“强制外键约束”或“强制用于复制”设置为“是”,能确保任何数据添加、修改或删除操作都不会违背外键关系。
如果对主键表进行更新(Update)或删除(Delete)一行数据的操作,检查主键表的主键是否被外键表的外键引用,分为以下两种情况:
若没有被引用,则更新或删除。
若被引用,则对于下面的选项,可能发生如下4种操作之一:
不执行任何操作:拒绝更新或删除主键表,SQL Server 2014将显示一条错误消息,告知用户不允许执行该操作。
级联:级联更新或删除外键表中相应的所有行。
设置NULL:将外键表中相应的外键值设置为空值NULL。
设置默认值:如果外键表的所有外键列均已定义默认值,则将该列设置为默认值。
6)单击“更新规则”和“删除规则”对应文本框右边的下拉列表,设置“更新规则”和“删除规则”的值为“级联”,即当表Category中某种类别的数据行更新或删除时,Product表中相应产品的数据行也随之更新或删除,如图3-54所示。
7)单击“关闭”按钮即可完成外键约束的创建。
8)如要删除外键约束,则在该对话框的“选定的关系”列表框中选择要删除的关系,单击“删除”按钮即可。