创建和修改 FOREIGN KEY 约束

创建表时,可以创建 FOREIGN KEY 约束作为表定义的一部分。如果表已经存在,则可以添加 FOREIGN KEY 约束(假设该 FOREIGN KEY 约束被链接到了另一个或同一个表中某个现有的 PRIMARY KEY 约束或 UNIQUE 约束)。一个表可含有多个 FOREIGN KEY 约束。

如果 FOREIGN KEY 约束已经存在,则可以修改或删除它。例如,可能需要使表的 FOREIGN KEY 约束引用其他列。但是,不能更改定义了 FOREIGN KEY 约束的列的长度。

注意注意

若要修改 FOREIGN KEY 约束,必须首先删除现有的 FOREIGN KEY 约束,然后用新定义重新创建。

删除 FOREIGN KEY 约束可消除外键列与另一表中相关主键列或 UNIQUE 约束列之间的引用完整性要求。

在创建表时创建 FOREIGN KEY 约束

CREATE TABLE (Transact-SQL)

在现有表中创建 FOREIGN KEY 约束

ALTER TABLE (Transact-SQL)

如何在表之间创建关系 (Visual Database Tools)

删除 FOREIGN KEY 约束

ALTER TABLE (Transact-SQL)

使用 WITH NOCHECK 强制执行 FOREIGN KEY 约束

当向表中的现有列添加 FOREIGN KEY 约束时,默认情况下 数据库引擎 会检查列中的现有数据,以确保除 NULL 以外的所有值存在于被引用的 PRIMARY KEY 或 UNIQUE 约束列中。但是,通过指定 WITH NOCHECK,数据库引擎可以不针对新约束检查列数据,并添加新约束而不考虑列数据。如果现有数据已符合新的 FOREIGN KEY 约束,或业务规则要求仅从此开始强制执行约束,则可以使用 WITH NOCHECK 选项。

但是,添加约束而不对现有数据进行检查时应谨慎,因为这样会忽略数据库引擎中的用于强制表中数据完整性的控制。

创建 FOREIGN KEY 约束时不对现有数据进行检查

ALTER TABLE (Transact-SQL)

禁用 FOREIGN KEY 约束

可以对特定操作(例如 INSERT 操作、UPDATE 操作和复制处理)禁用现有的 FOREIGN KEY 约束。

  • INSERT 和 UPDATE 语句

    禁用 FOREIGN KEY 约束将使表中的数据不经约束验证便可修改。在执行 INSERT 和 UPDATE 语句过程中,如果新数据违反约束或约束应当仅应用于数据库中已有的数据,则应禁用 FOREIGN KEY 约束。

    注意注意

    将不对包含已禁用外键的行执行对相关主键定义的任何级联操作。

  • 复制处理

    如果 FOREIGN KEY 约束是源数据库特有的,应在复制过程中禁用该约束。复制表时,将把表定义和数据从源数据库复制到目标数据库。如果 FOREIGN KEY 约束是源数据库特有的,但在复制过程中未禁用该约束,则它们可能会无谓地妨碍向目标数据库输入新数据。有关详细信息,请参阅使用 NOT FOR REPLICATION 来控制约束、标识和触发器

对 INSERT 和 UPDATE 语句禁用 FOREIGN KEY 约束

ALTER TABLE (Transact-SQL)

如何对 INSERT 和 UPDATE 语句禁用外键约束 (Visual Database Tools)

在复制时禁用 FOREIGN KEY 约束

ALTER TABLE (Transact-SQL)

如何对复制禁用外键约束 (Visual Database Tools)

获得有关 FOREIGN KEY 约束的信息

sys.foreign_keys (Transact-SQL)

获得有关组成 FOREIGN KEY 约束的列的信息

sys.foreign_key_columns (Transact-SQL)

请参阅

概念