fbpx
维基百科

外键

外來鍵又称外部鍵,是指在關聯式資料庫中,每個資料表都是由關聯來連繫彼此的關係,父資料表(Parent Entity)的主鍵Primary Key)會放在另一個資料表,當做屬性以建立彼此的關聯,而這個屬性就是外來鍵。

比如,學生跟老師之間是教學的關聯,學生資料表會有個屬性叫指導老師(FK),而這個值就是對應到老師資料表的老師代號(PK),學生的指導老師就是外來鍵。

外键是表中的一组特性,它引用另一个表的主键。外键链接这两个表。另一种说法:在关系数据库的上下文中,外键是一组受某种包含依赖约束的特性,特别是由一个关系R中的外键特性组成的元组必须也存在于其他一些(不一定是不同的)关系S中,而且这些属性也必须是S中的候选键[1][2][3]简而言之,外键是一组引用候选键的特性。 例如,名为TEAM的表可能有一个属性 MEMBER_NAME,它引用PERSON表中的候选键PERSON_NAME作为外键。 由于MEMBER_NAME是一个外键,任何在TEAM中作为成员名称存在的值也必须作为人名存在于PERSON表中; 换句话说,一个团队的每个成员也是一个人。

概述

包含外键的表称为子表(child table),包含候选键的表称为“被引用表”(referenced )或父表(parent table)。[4]在数据库关系建模和实现中,候选键是一组零个或多个特性,其值对于关系中的每个元组(行)保证是唯一的。任何元组的候选键特性的值或值组合不能与该关系中的任何其他元组重复。

由于外键的目的是标识被引用表的某一行,所以一般要求外键等于主表某行的候选键,否则没有值(NULL[2])。此规则称为两个表之间的参照完整性约束。[5]因为违反这些约束可能是许多数据库问题的根源,所以大多数数据库管理系统提供了确保每个非空外键对应于引用表的一行的机制。[6][7][8]

例如,考虑一个包含两个表的数据库:一个包含所有客户数据的 CUSTOMER 表和一个包含所有客户订单的 ORDER 表。假设业务要求每个订单必须指向一个客户。为了在数据库中反映这一点,在 ORDER 表中添加了一个外键列(例如 CUSTOMERID),它引用了 CUSTOMER 的主键(例如 ID)。因为表的主键必须是唯一的,并且因为 CUSTOMERID 仅包含来自该主键字段的值,所以我们可以假设,当它具有值时,CUSTOMERID 将标识出下订单的特定客户。但是,如果在删除 CUSTOMER 表的行或更改 ID 列时 ORDER 表没有保持最新,则上述约束不再保证成立,并且使用这些表可能会变得更加困难。许多现实世界的数据库通过“停用”而不是物理删除主表外键,或者通过复杂的更新程序来解决这个问题,这些程序在需要更改时修改对外键的所有引用。

外键在数据库设计中起着至关重要的作用。数据库设计的一个重要部分是确保真实世界实体之间的关系通过引用反映在数据库中,使用外键从一个表引用到另一个表。[9]数据库设计的另一个重要部分是数据库规范化,其中表被分解并且外键使得它们可以被重构。[10]

引用表(或子表)中的多行可能引用到被引用表(或父表)中的同一行。在这种情况下,两个表之间的关系称为引用表和被引用表之间的一对多关系。

此外,实际上,子表和父表可能是同一张表,即外键指向同一张表。这种外键在 SQL:2003 中称为自引用(self-referencing)或递归外键(recursive foreign key)。在数据库管理系统中,这通常是通过将第一个和第二个引用链接到同一个表来完成的。

一个表可能有多个外键,每个外键可以有不同的父表。每个外键都由数据库系统独立执行。因此,可以使用外键建立表之间的级联关系。

外键定义为关系中的一个特性或一组特性,其值与另一个关系中的主键匹配。将此类约束添加到现有表的语法在 SQL:2003 中定义,如下所示。

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名) REFERENCES 外表表名(主键字段名) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] 

REFERENCES子句中省略列列表意味着外键应引用到被引用表的主键。同样,外键可以定义为CREATE TABLE语句的一部分。

CREATE TABLE child_table (  col1 INTEGER PRIMARY KEY,  col2 CHARACTER VARYING(20),  col3 INTEGER,  col4 INTEGER,  FOREIGN KEY(col3, col4) REFERENCES parent_table(col1, col2) ON DELETE CASCADE ) 

如果外键是一个单独列,则可以使用下属语法:

CREATE TABLE child_table (  col1 INTEGER PRIMARY KEY,  col2 CHARACTER VARYING(20),  col3 INTEGER,  col4 INTEGER REFERENCES parent_table(col1) ON DELETE CASCADE ) 

外键也可以用存储过程语句定义:

sp_foreignkey child_table, parent_table, col3, col4 
  • child_table:
  • parent_table: 该候选键必须已经定义了
  • col3col4: 外键的名字。包括1列至8列。

引用动作

在对主表做行删除或修改时,为确保引用完整性,SQL:2003给出了5种“引用动作(referential actions):

CASCADE

在对主表的行删除或修改时,从表中有匹配的外键值的行也相应被删除或修改。

ON DELETE CASCADE修改了从表的行为,引入了对从表的自动删除或修改的行为。

RESTRICT

在对主表的行删除或修改时,如果子表中有匹配的外键值的行,则主表中相应的行不能被删除或修改。

ON DELETE RESTRICT是对主表的行为约束,虽然写在了从表的定义中。

RESTRICT未被Microsoft SQL Server 2012及更早的版本支持。

NO ACTION

NO ACTION和RESTRICT非常像。但NO ACTION在尝试修改主表后检查引用完整性。如果在这种检查之前执行了数据库触发器,可能在检查时就不违背引用完整性。

SET NULL, SET DEFAULT

从表中的外键列被分别设为NULL或缺省值。

Triggers

引用动作通常被实现为隐含的触发器(即通常是隐藏的、具有系统生成名称的触发器)。因此,它们受到与用户定义触发器相同的限制,并且它们相对于其他触发器的执行顺序可能需要经过考虑;在某些情况下,可能需要将引用操作替换为其等效的用户定义触发器,以确保正确的执行顺序,或解决变异表(mutating-table)的限制。

另一个重要限制出现在事務隔離时:对行的更改可能无法完全级联,这是因为该行被事务无法“看到”的数据所引用,因此无法级联。一个例子:当事務尝试重新编号客户帐户时,同时另一事務正在尝试为同一客户创建新发票;虽然 CASCADE 规则可能会修改事務可以看到的所有发票行以使其与重新编号的客户行保持一致,但它不会进入另一个事務来修改那里的数据;因为数据库不能保证两个事务提交时数据一致,所以其中一个事务将被强制回滚(通常是先到先得)。

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); CREATE TRIGGER ins_sum BEFORE INSERT ON account  FOR EACH ROW SET @sum = @sum + NEW.amount; 

例子

一个简单的关系:

 Supplier (SupplierNumber, Name, Address) Invoice (InvoiceNumber, Text, SupplierNumber) 

資料定義語言语句为:

CREATE TABLE Supplier (  SupplierNumber INTEGER NOT NULL,  Name VARCHAR(20) NOT NULL,  Address VARCHAR(50) NOT NULL,  CONSTRAINT supplier_pk PRIMARY KEY(SupplierNumber),  CONSTRAINT number_value CHECK(SupplierNumber > 0) ) CREATE TABLE Invoice (  InvoiceNumber INTEGER NOT NULL,  Text VARCHAR(4096),  SupplierNumber INTEGER NOT NULL,  CONSTRAINT invoice_pk PRIMARY KEY(InvoiceNumber),  CONSTRAINT inumber_value CHECK (InvoiceNumber > 0),  CONSTRAINT supplier_fk  FOREIGN KEY(SupplierNumber) REFERENCES Supplier(SupplierNumber)  ON UPDATE CASCADE ON DELETE RESTRICT ) 

参考文献

  1. ^ Coronel, Carlos. Database Systems: Design, Implementation, and Management. Independence KY: South-Western/Cengage Learning. 2010: 65. ISBN 978-0-538-74884-1. 
  2. ^ 2.0 2.1 Elmasri, Ramez. Fundamentals of Database Systems . Addison-Wesley. 2011: 73–74. ISBN 978-0-13-608620-8. 
  3. ^ Date, C. J. A guide to the SQL standard. Addison-Wesley. 1996: 206. ISBN 978-0201964264. 
  4. ^ Sheldon, Robert. Beginning MySQL. John Wiley & Sons. 2005: 119–122. ISBN 0-7645-7950-9. 
  5. ^ Database Basics — Foreign Keys. [2010-03-13]. 
  6. ^ MySQL AB. MySQL Administrator's Guide and Language Reference. Sams Publishing. 2006: 40. ISBN 0-672-32870-4. 
  7. ^ Powell, Gavin. Oracle SQL: Jumpstart with Examples . Elsevier. 2004: 11. ASIN B008IU3AHY. 
  8. ^ Mullins, Craig. DB2 developer's guide. IBM Press. 2012. ASIN B007Y6K9TK. 
  9. ^ Sheldon, Robert. Beginning MySQL. John Wiley & Sons. 2005: 156. ISBN 0-7645-7950-9. 
  10. ^ Garcia-Molina, Hector. Database Systems: The Complete Book . Prentice Hall. 2009: 93–95. ISBN 978-0-13-187325-4. 

外部链接

  • 一個詳細介紹外鍵的網站 (页面存档备份,存于互联网档案馆
  • SQL-99 Foreign Keys
  • PostgreSQL Foreign Keys
  • MySQL Foreign Keys
  • FirebirdSQL primary Keys
  • Microsoft SQL 2012 table_constraint (Transact-SQL)

外键, 外來鍵又称外部鍵, 是指在關聯式資料庫中, 每個資料表都是由關聯來連繫彼此的關係, 父資料表, parent, entity, 的主鍵, primary, 會放在另一個資料表, 當做屬性以建立彼此的關聯, 而這個屬性就是外來鍵, 比如, 學生跟老師之間是教學的關聯, 學生資料表會有個屬性叫指導老師, 而這個值就是對應到老師資料表的老師代號, 學生的指導老師就是外來鍵, 是表中的一组特性, 它引用另一个表的主键, 链接这两个表, 另一种说法, 在关系数据库的上下文中, 是一组受某种包含依赖约束的特性, 特别是. 外來鍵又称外部鍵 是指在關聯式資料庫中 每個資料表都是由關聯來連繫彼此的關係 父資料表 Parent Entity 的主鍵 Primary Key 會放在另一個資料表 當做屬性以建立彼此的關聯 而這個屬性就是外來鍵 比如 學生跟老師之間是教學的關聯 學生資料表會有個屬性叫指導老師 FK 而這個值就是對應到老師資料表的老師代號 PK 學生的指導老師就是外來鍵 外键是表中的一组特性 它引用另一个表的主键 外键链接这两个表 另一种说法 在关系数据库的上下文中 外键是一组受某种包含依赖约束的特性 特别是由一个关系R中的外键特性组成的元组必须也存在于其他一些 不一定是不同的 关系S中 而且这些属性也必须是S中的候选键 1 2 3 简而言之 外键是一组引用候选键的特性 例如 名为TEAM的表可能有一个属性 MEMBER NAME 它引用PERSON表中的候选键PERSON NAME作为外键 由于MEMBER NAME是一个外键 任何在TEAM中作为成员名称存在的值也必须作为人名存在于PERSON表中 换句话说 一个团队的每个成员也是一个人 目录 1 概述 2 引用动作 2 1 CASCADE 2 2 RESTRICT 2 3 NO ACTION 2 4 SET NULL SET DEFAULT 2 5 Triggers 3 例子 4 参考文献 5 外部链接概述 编辑包含外键的表称为子表 child table 包含候选键的表称为 被引用表 referenced 或父表 parent table 4 在数据库关系建模和实现中 候选键是一组零个或多个特性 其值对于关系中的每个元组 行 保证是唯一的 任何元组的候选键特性的值或值组合不能与该关系中的任何其他元组重复 由于外键的目的是标识被引用表的某一行 所以一般要求外键等于主表某行的候选键 否则没有值 NULL 2 此规则称为两个表之间的参照完整性约束 5 因为违反这些约束可能是许多数据库问题的根源 所以大多数数据库管理系统提供了确保每个非空外键对应于引用表的一行的机制 6 7 8 例如 考虑一个包含两个表的数据库 一个包含所有客户数据的 CUSTOMER 表和一个包含所有客户订单的 ORDER 表 假设业务要求每个订单必须指向一个客户 为了在数据库中反映这一点 在 ORDER 表中添加了一个外键列 例如 CUSTOMERID 它引用了 CUSTOMER 的主键 例如 ID 因为表的主键必须是唯一的 并且因为 CUSTOMERID 仅包含来自该主键字段的值 所以我们可以假设 当它具有值时 CUSTOMERID 将标识出下订单的特定客户 但是 如果在删除 CUSTOMER 表的行或更改 ID 列时 ORDER 表没有保持最新 则上述约束不再保证成立 并且使用这些表可能会变得更加困难 许多现实世界的数据库通过 停用 而不是物理删除主表外键 或者通过复杂的更新程序来解决这个问题 这些程序在需要更改时修改对外键的所有引用 外键在数据库设计中起着至关重要的作用 数据库设计的一个重要部分是确保真实世界实体之间的关系通过引用反映在数据库中 使用外键从一个表引用到另一个表 9 数据库设计的另一个重要部分是数据库规范化 其中表被分解并且外键使得它们可以被重构 10 引用表 或子表 中的多行可能引用到被引用表 或父表 中的同一行 在这种情况下 两个表之间的关系称为引用表和被引用表之间的一对多关系 此外 实际上 子表和父表可能是同一张表 即外键指向同一张表 这种外键在 SQL 2003 中称为自引用 self referencing 或递归外键 recursive foreign key 在数据库管理系统中 这通常是通过将第一个和第二个引用链接到同一个表来完成的 一个表可能有多个外键 每个外键可以有不同的父表 每个外键都由数据库系统独立执行 因此 可以使用外键建立表之间的级联关系 外键定义为关系中的一个特性或一组特性 其值与另一个关系中的主键匹配 将此类约束添加到现有表的语法在 SQL 2003 中定义 如下所示 ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY 外键字段名 REFERENCES 外表表名 主键字段名 ON DELETE RESTRICT CASCADE SET NULL NO ACTION SET DEFAULT ON UPDATE RESTRICT CASCADE SET NULL NO ACTION SET DEFAULT 在REFERENCES子句中省略列列表意味着外键应引用到被引用表的主键 同样 外键可以定义为CREATE TABLE语句的一部分 CREATE TABLE child table col1 INTEGER PRIMARY KEY col2 CHARACTER VARYING 20 col3 INTEGER col4 INTEGER FOREIGN KEY col3 col4 REFERENCES parent table col1 col2 ON DELETE CASCADE 如果外键是一个单独列 则可以使用下属语法 CREATE TABLE child table col1 INTEGER PRIMARY KEY col2 CHARACTER VARYING 20 col3 INTEGER col4 INTEGER REFERENCES parent table col1 ON DELETE CASCADE 外键也可以用存储过程语句定义 sp foreignkey child table parent table col3 col4 child table parent table 该候选键必须已经定义了 col3 和 col4 外键的名字 包括1列至8列 引用动作 编辑在对主表做行删除或修改时 为确保引用完整性 SQL 2003给出了5种 引用动作 referential actions CASCADE RESTRICT NO ACTION SET NULL SET DEFAULTCASCADE 编辑 在对主表的行删除或修改时 从表中有匹配的外键值的行也相应被删除或修改 ON DELETE CASCADE修改了从表的行为 引入了对从表的自动删除或修改的行为 RESTRICT 编辑 在对主表的行删除或修改时 如果子表中有匹配的外键值的行 则主表中相应的行不能被删除或修改 ON DELETE RESTRICT是对主表的行为约束 虽然写在了从表的定义中 RESTRICT未被Microsoft SQL Server 2012及更早的版本支持 NO ACTION 编辑 NO ACTION和RESTRICT非常像 但NO ACTION在尝试修改主表后检查引用完整性 如果在这种检查之前执行了数据库触发器 可能在检查时就不违背引用完整性 SET NULL SET DEFAULT 编辑 从表中的外键列被分别设为NULL或缺省值 Triggers 编辑 引用动作通常被实现为隐含的触发器 即通常是隐藏的 具有系统生成名称的触发器 因此 它们受到与用户定义触发器相同的限制 并且它们相对于其他触发器的执行顺序可能需要经过考虑 在某些情况下 可能需要将引用操作替换为其等效的用户定义触发器 以确保正确的执行顺序 或解决变异表 mutating table 的限制 另一个重要限制出现在事務隔離时 对行的更改可能无法完全级联 这是因为该行被事务无法 看到 的数据所引用 因此无法级联 一个例子 当事務尝试重新编号客户帐户时 同时另一事務正在尝试为同一客户创建新发票 虽然 CASCADE 规则可能会修改事務可以看到的所有发票行以使其与重新编号的客户行保持一致 但它不会进入另一个事務来修改那里的数据 因为数据库不能保证两个事务提交时数据一致 所以其中一个事务将被强制回滚 通常是先到先得 CREATE TABLE account acct num INT amount DECIMAL 10 2 CREATE TRIGGER ins sum BEFORE INSERT ON account FOR EACH ROW SET sum sum NEW amount 例子 编辑一个简单的关系 Supplier SupplierNumber Name Address Invoice InvoiceNumber Text SupplierNumber 資料定義語言语句为 CREATE TABLE Supplier SupplierNumber INTEGER NOT NULL Name VARCHAR 20 NOT NULL Address VARCHAR 50 NOT NULL CONSTRAINT supplier pk PRIMARY KEY SupplierNumber CONSTRAINT number value CHECK SupplierNumber gt 0 CREATE TABLE Invoice InvoiceNumber INTEGER NOT NULL Text VARCHAR 4096 SupplierNumber INTEGER NOT NULL CONSTRAINT invoice pk PRIMARY KEY InvoiceNumber CONSTRAINT inumber value CHECK InvoiceNumber gt 0 CONSTRAINT supplier fk FOREIGN KEY SupplierNumber REFERENCES Supplier SupplierNumber ON UPDATE CASCADE ON DELETE RESTRICT 参考文献 编辑 Coronel Carlos Database Systems Design Implementation and Management Independence KY South Western Cengage Learning 2010 65 ISBN 978 0 538 74884 1 2 0 2 1 Elmasri Ramez Fundamentals of Database Systems Addison Wesley 2011 73 74 ISBN 978 0 13 608620 8 Date C J A guide to the SQL standard Addison Wesley 1996 206 ISBN 978 0201964264 Sheldon Robert Beginning MySQL John Wiley amp Sons 2005 119 122 ISBN 0 7645 7950 9 Database Basics Foreign Keys 2010 03 13 MySQL AB MySQL Administrator s Guide and Language Reference Sams Publishing 2006 40 ISBN 0 672 32870 4 Powell Gavin Oracle SQL Jumpstart with Examples Elsevier 2004 11 ASIN B008IU3AHY Mullins Craig DB2 developer s guide IBM Press 2012 ASIN B007Y6K9TK Sheldon Robert Beginning MySQL John Wiley amp Sons 2005 156 ISBN 0 7645 7950 9 Garcia Molina Hector Database Systems The Complete Book Prentice Hall 2009 93 95 ISBN 978 0 13 187325 4 含有內容需登入查看的頁面 link 外部链接 编辑一個詳細介紹外鍵的網站 页面存档备份 存于互联网档案馆 SQL 99 Foreign Keys PostgreSQL Foreign Keys MySQL Foreign Keys FirebirdSQL primary Keys SQLite support for Foreign Keys Microsoft SQL 2012 table constraint Transact SQL 取自 https zh wikipedia org w index php title 外键 amp oldid 75431586, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。