您的位置:首页 > 其它

【关于外键约束的一些常见问题】 (转)

2011-07-10 18:24 302 查看
【关于外键约束的一些常见问题】

/********************************************************************

Author:js_szy

Date:2010-11-08

Version:

Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)

Oct 14 2005 00:33:37

Copyright (c) 1988-2005 Microsoft Corporation

Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

********************************************************************/

--> 测试数据: [tb]

if OBJECT_ID('[tb]') is not null DROP TABLE [tb]

go

--> 测试数据: [ta]

if OBJECT_ID('[ta]') is not null DROP TABLE [ta]

go

CREATE TABLE [ta]

(

id int PRIMARY KEY,

name varchar(1)

)

CREATE TABLE [tb]

(

id1 int CONSTRAINT fk_1 FOREIGN KEY REFERENCES ta(id),

name1 varchar(1)

)

INSERT INTO [ta]

SELECT 1,'a' UNION ALL

SELECT 2,'b'

INSERT INTO [tb]

SELECT 1,'q' UNION ALL

SELECT 1,'w' UNION ALL

SELECT 2,'s'

/*******************************************************************/

一、创建外键约束:

1、创建表时建外键约束:

CREATE TABLE[tb]

(

id1 int CONSTRAINT fk_1 FOREIGN KEY REFERENCES ta(id),

name1 varchar(1)

)

2、在已有表上创建约束

ALTER TABLEtb ADD CONSTRAINT fk_1 FOREIGN KEY (id1) REFERENCES ta(id)

/*******************************************************************/

二、删除约束:

ALTER TABLEtb DROP CONSTRAINT fk_1

/*******************************************************************/

三、下面介绍一下一些常见的错误:

1、先建子表

/*

错误信息

消息1767,级别16,状态0,第1 行

外键'FK__tb__id1__7814D14C' 引用了无效的表'ta'。

消息1750,级别16,状态0,第1 行

无法创建约束。请参阅前面的错误消息。

解决方法:

先建主表

*/

2、先删主表

/*

错误信息:

消息3726,级别16,状态1,第2 行

无法删除对象'ta',因为该对象正由一个FOREIGN KEY 约束引用。

消息2714,级别16,状态6,第3 行

数据库中已存在名为'ta' 的对象。

解决方法:

先删子表

*/

3、插入子表数据,主表中不存在子表插入的键值

INSERT INTO [tb]

SELECT 5,'q' -- 5 在主表中不存在

/*

错误信息:

消息547,级别16,状态0,第1 行

INSERT 语句与FOREIGN KEY 约束"FK__tb__id1__5D60DB10"冲突。该冲突发生于数据库"szy",表"dbo.ta", column 'id'。

语句已终止。

解决方法:

必须先插入主表,再插入子表

*/

4、先删除主表数据

delete from ta where id=1

/*

错误信息:

消息547,级别16,状态0,第68 行

DELETE 语句与REFERENCE 约束"FK__tb__id1__047AA831"冲突。该冲突发生于数据库"szy",表"dbo.tb", column 'id1'。

语句已终止。

解决方法:

先删子表,再删主表

delete from tb where id1=1

delete from ta where id=1

*/

5、在已有数据的表上添加外键约束

(如果表中存在主表与子表没有关联的键值,将报如下错误)

ALTER TABLEtb ADD FOREIGN KEY (id1) REFERENCES ta(id)

/*

消息547,级别16,状态0,第20 行

ALTER TABLE 语句与FOREIGN KEY 约束"FK__tb__id1__23F3538A"冲突。该冲突发生于数据库"szy",表"dbo.ta", column 'id'。

*/

/*******************************************************************/

总结:对有外键约束表的操作顺序,先建主,再建子。先删子,再删主。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: