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

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

 

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

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'

    */

 

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

 

总结:对有外键约束表的操作顺序,先建主,再建子。先删子,再删主。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值