ITPub博客

首页 > 应用开发 > IT综合 > 外键技术

外键技术

原创 IT综合 作者:kitesky 时间:2005-02-27 21:39:31 0 删除 编辑

一、语法

FOREIGN KEY 约束主要目的是控制存储在外键表中的数据,但它还可以控制对主键表中数据的修改。FOREIGN KEY 约束并不仅仅只可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束不允许空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过 FOREIGN KEY 约束的校验。FOREIGN KEY 可以引用同一表中的其它列(自引用)。一个表最多可包含 253 个 FOREIGN KEY 约束。每个表在其 FOREIGN KEY 约束中最多可以引用 253 个不同的表。
列级 FOREIGN KEY 约束放在列说明部分,表级 FOREIGN KEY 约束放在全部列说明之后,用","和列说明分开。

  • 列级 FOREIGN KEY 约束的 REFERENCES 子句仅能列出一个引用列,且该列必须与定义约束的列具有相同的数据类型。
  • 表级 FOREIGN KEY 约束的 REFERENCES 子句中引用列的数目必须与约束列列表中的列数相同。每个引用列的数据类型也必须与列表中相应列的数据类型相同。

    1) 新建
    作为表定义的一部分在创建表时创建。一个表可以有多个 FOREIGN KEY 约束。
    < column_constraint > ::= [ CONSTRAINT constraint_name ]
        { [ NULL | NOT NULL ]
            | [ { PRIMARY KEY | UNIQUE }
                [ CLUSTERED | NONCLUSTERED ]
                [ WITH FILLFACTOR = fillfactor ]
                [ON {filegroup | DEFAULT} ] ]
            ]
            | [ [ FOREIGN KEY ]
                REFERENCES ref_table [ ( ref_column ) ]
                [ ON DELETE { CASCADE | NO ACTION } ]
                [ ON UPDATE { CASCADE | NO ACTION } ]
                [ NOT FOR REPLICATION ]
            ]
            | CHECK [ NOT FOR REPLICATION ]
            ( logical_expression )
        }

    < table_constraint > ::= [ CONSTRAINT constraint_name ]
        { [ { PRIMARY KEY | UNIQUE }
            [ CLUSTERED | NONCLUSTERED ]
            { ( column [ ASC | DESC ] [ ,...n ] ) }
            [ WITH FILLFACTOR = fillfactor ]
            [ ON { filegroup | DEFAULT } ]
        ]
        | FOREIGN KEY
            [ ( column [ ,...n ] ) ]
            REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
            [ ON DELETE { CASCADE | NO ACTION } ]
            [ ON UPDATE { CASCADE | NO ACTION } ]
            [ NOT FOR REPLICATION ]
        | CHECK [ NOT FOR REPLICATION ]
            ( search_conditions )
        }

    2) 删除
    ALTER TABLE table_name DROP CONSTRAINT constraint_name

    3)修改
    必须首先删除已有的 FOREIGN KEY 约束,然后再通过新定义重新创建。
    ALTER TABLE table_name DROP CONSTRAINT constraint_name
    ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (外键表的列) REFERENCES 主键表(主键表的列)

    4) 主键表
    显示关系中主表的名称,后面是构成主键的列。

    5) 外键表
    显示关系中外键表的名称,后面是构成外键的列。

  • 二、说明

    1) 创建中检查现存数据
    在外键表上添加关系时,对数据库中已存在的数据应用约束。

    2) 对 INSERT 和 UPDATE 强制关系
    对在外键表中插入、删除或更新的数据应用该约束。如果外键表中存在匹配的行,还将禁止删除主表中的行。

    3) 对复制强制关系
    在将外键表复制到其它数据库时应用该约束。NOT FOR REPLICATION

    4) 级联更新相关的字段
    无论何时更新主键值,都指示 DBMS 自动更新该关系的外键值。ON UPDATE {CASCADE | NO ACTION}
    如果指定 CASCADE,则在父表中更新被引用行时,也将在引用表中更新引用行;
    如果指定 NO ACTION,SQL Server 将产生一个错误并回滚父表中的行更新操作。

    5) 级联删除相关的字段
    无论何时删除主表的被引用行,都指示 DBMS 自动删除外键表的行。ON DELETE {CASCADE | NO ACTION} 
    如果指定 CASCADE,则从父表中删除被引用行时,也将从引用表中删除引用行;
    如果指定 NO ACTION,SQL Server 将产生一个错误并回滚父表中的行删除操作。

    [@more@]

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/66009/viewspace-791264/,如需转载,请注明出处,否则将追究法律责任。

    请登录后发表评论 登录
    全部评论

    注册时间:2009-04-22

    • 博文量
      273
    • 访问量
      2172382