FOREIGN KEY 约束
FOREIGN KEY 约束用于引用其它表。FOREIGN KEY 可以是单列键或多列键。下例显示 employee 表上引用 jobs 表的单列 FOREIGN KEY 约束。对于单列 FOREIGN KEY 约束,只需要 REFERENCES 子句。job_id   smallint      NOT NULL
      DEFAULT 1
      REFERENCES jobs(job_id)也可以显式使用 FOREIGN KEY 子句并复述列特性。注意在这两个表中列名不必相同。FOREIGN KEY (job_id) REFERENCES jobs(job_id)多列键约束作为表约束创建。在 pubs 数据库中,sales 表包含多列 PRIMARY KEY。下例显示如何从其它表中引用此键(可选择显式约束名)。CONSTRAINT FK_sales_backorder FOREIGN KEY (stor_id, ord_num, title_id)
   REFERENCES sales (stor_id, ord_num, title_id)

解决方案 »

  1.   

    一个 PRIMARY KEY 约束可以: 作为表定义的一部分在创建表时创建。
    添加到尚没有 PRIMARY KEY 约束的表中(一个表只能有一个 PRIMARY KEY 约束)。
    如果已有 PRIMARY KEY 约束,则可对其进行修改或删除。例如,可以使表的 PRIMARY KEY 约束引用其它列,更改列的顺序、索引名、聚集选项或 PRIMARY KEY 约束的填充因子。定义了 PRIMARY KEY 约束的列的列宽不能更改。 
    说明  若要使用 Transact-SQL 或 SQL-DMO 修改 PRIMARY KEY,必须先删除现有的 PRIMARY KEY 约束,然后再用新定义重新创建。当向表中的现有列添加 PRIMARY KEY 约束时,Microsoft® SQL Server™ 2000 检查列中现有的数据以确保现有数据遵从主键的规则: 无空值
    无重复值 
    如果 PRIMARY KEY 约束添加到具有空值或重复值的列上,SQL Server 不执行该操作并返回错误信息。不能添加违背上述规定的 PRIMARY KEY 约束。SQL Server 自动创建唯一的索引来强制 PRIMARY KEY 约束所要求的唯一性。如果表中不存在聚集索引或未明确指定非聚集索引,则将创建唯一的聚集索引强制 PRIMARY KEY 约束。重要  当 PRIMARY KEY 约束由另一表的 FOREIGN KEY 约束引用时,不能删除 PRIMARY KEY 约束;要删除它,必须先删除 FOREIGN KEY 约束。
      

  2.   

    FOREIGN KEY 约束可以: 作为表定义的一部分在创建表时创建。
    如果 FOREIGN KEY 约束与另一个表(或同一表)已有的 PRIMARY KEY 约束或 UNIQUE 约束相关联,则可向现有表添加 FOREIGN KEY 约束。一个表可以有多个 FOREIGN KEY 约束。
    对已有的 FOREIGN KEY 约束进行修改或删除。例如,要使一个表的 FOREIGN KEY 约束引用其它列。定义了 FOREIGN KEY 约束列的列宽不能更改。 
    说明  若要使用 Transact-SQL 或 SQL-DMO修改 FOREIGN KEY 约束,必须首先删除已有的 FOREIGN KEY 约束,然后再通过新定义重新创建。当向表的现有列添加 FOREIGN KEY 约束时,默认情况下 Microsoft® SQL Server™ 2000 检查列中的现有数据,以确保除 NULL 外的所有数据存在于被引用的 PRIMARY KEY 或 UNIQUE 约束的列中。不过,SQL Server 也可不对列数据的新约束进行检查,不考虑列中的数据而添加新约束。当现有数据已符合新的 FOREIGN KEY 约束,或业务规则要求从此开始强制约束时,使用此选项比较有用。不过,添加约束而不进行数据检查时一定要注意,因为这样放弃了 SQL Server 对表中数据完整性的控制。禁用 FOREIGN KEY 约束
    下列情况可以禁用 FOREIGN KEY 约束: INSERT 和 UPDATE 语句 
    这种情况允许不经约束验证就可修改表中的数据。在执行 INSERT 和 UPDATE 语句过程中,如果新数据违反约束或约束只应适用于数据库中已有的数据,那么禁用 FOREIGN KEY 约束。复制处理。 
    如果一个 FOREIGN KEY 约束为源数据库特有,请在复制时禁用该约束。复制表时,表定义和数据从源数据库复制到目的数据库。这两个数据库通常(但不一定)在不同的服务器上。如果 FOREIGN KEY 约束为源数据库特有而在复制时未禁用,则有可能无谓地妨碍向目标数据库输入数据。删除 FOREIGN KEY 约束,从而删除了强制外键列和另一表中相关主键(或 UNIQUE 约束)列的引用完整性要求。
      

  3.   

    谢谢,不过我还有些不明白FOREIGN KEY 约束 与 COLUMN REFERENCE 约束有什么细节上的区别。我现在的问题是更新仅存在一个外键的主表出现了COLUMN REFERENCE约束错误。实在无法理解。
      

  4.   

    当B表含有FOREIGN KEY X,X 存在于A表中时,如果你要删除表中的记录,就会出现COLUMN REFERENCE约束错误
      

  5.   

    举例:Create database cat
    go
    use cat
    go
    CREATE TABLE s(s# int not null primary key,s_name varchar(8) not null)
    go
    CREATE TABLE c (c# int not null primary key,c_name varchar(8) not null)
    go
    CREATE TABLE cs(c# int not null,s# int not null,cj tinyint not null default(0),
    primary key (c#,s#),foreign key(s#) references s(s#),foreign key(c#) references c(c#))
    go
    insert s values(1,'saa')
    insert c values(1,'caa')--这句是对的
    insert cs values(1,1,86)--这句是错的,sql会报错,应为s表的s#列里没有2
    insert cs vlaues(2,1,45)
      

  6.   

    ckp(surge) :当B表含有FOREIGN KEY X,X 存在于A表中时,如果你要删除表中的记录,就会出现COLUMN REFERENCE约束错误FOREIGN KEY X,X 指的是,如果是外键引用,应该是COLUMN FOREIGN KEY 约束 错误才对。pengdali(大力 V2.0) :
    我的表里没有联合主键。只是简单的一个外键。却出现了COLUMN REFERENCE 约束。为什么?FOREIGN KEY 约束 与 COLUMN REFERENCE 约束有什么细节上的区别。