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)
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)
添加到尚没有 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 约束。
如果 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 约束)列的引用完整性要求。
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)
我的表里没有联合主键。只是简单的一个外键。却出现了COLUMN REFERENCE 约束。为什么?FOREIGN KEY 约束 与 COLUMN REFERENCE 约束有什么细节上的区别。