【关于外键约束的一些常见问题】 (转)
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'。
*/
/*******************************************************************/
总结:对有外键约束表的操作顺序,先建主,再建子。先删子,再删主。
/********************************************************************
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'。
*/
/*******************************************************************/
总结:对有外键约束表的操作顺序,先建主,再建子。先删子,再删主。
相关文章推荐
- 【关于外键约束的一些常见问题】
- 由一个问题引发的思考——关于数据库的外键约束
- 关于站立会议的一些常见问题
- 关于Installshield里一些常见问题的解答—艾泽拉斯之海洋女神出品
- 关于posix sem的一些常见的问题
- 关于锁的一些常见问题
- TensorFlow官方文档解释关于TensorFlow的一些常见问题
- 关于PowerDesigner15不能从PDM图生成MS SQL2005/2008外键约束的问题
- 关于Installshield里一些常见问题的解答(二)--此篇非原创,只是集成了一些网友的解答
- 关于单链表的一些常见问题
- 关于Installshield里一些常见问题的解答—艾泽拉斯之海洋女神出品
- 关于PowerDesigner15不能从PDM图生成MS SQL2005/2008外键约束的问题
- 收集关于angular与JS的一些常见问题 总结
- 关于Recyclerview的一些常见问题
- 关于Installshield里一些常见问题的解答—艾泽拉斯之海洋女神出品
- 关于ajax对象一些常用属性、事件和方法大小写比较常见的问题总结
- 关于DNS的一些常见问题(问答篇)
- 关于EFS加密的一些常见问题
- 关于键值为其它表的外键约束时,无法删除表的问题
- 关于css兼容性问题及一些常见问题汇总