有劳各位,目前的一个问题:
有外键约束的两个表,主表,约束表
首先在主表中插入了数据,然后再在被约束表中插入相应的数据,还是提示如题所示错误。
打个比方:
表 A, 字段 ID
表 B, 字段 AID
B.AID 约束于 A.ID
我现在要在 B 表中插入一条数据, B.AID 的值, 在 A 表中已经存在
插入一条带有 B.AID = 5 的记录,此时 A.ID = 5 的记录已经存在了
但是还是如题所示错误…
补充:
不好意思,个人对数据库的了解并不是很专业,所以在表述上或存在不准确的地方,请见谅!
但是,我相信大家是能理解意思的,有劳各位指教!!!
33 个解决方案
#1
因为你插入的这个外键,这那个表找不到对应的数据。
比如你增加B.aid这个字段,但aid在A表中没有对应的数据,所以报错
这就是外键的作用
比如你增加B.aid这个字段,但aid在A表中没有对应的数据,所以报错
这就是外键的作用
#2
外键约束起作用了,其实可以用代码来检测外键。
#3
谢谢,我问题中已经说到了
我要在 B 中增加一条数据, 其中,AID = 5
AID 的外键是 A 表中的 ID,而且 ID = 5 的记录已经存在了…
______________________________
莫非是我这样理解的“外键”概念是错误的??
#4
而且,我把同样的 SQL 语句直接放到 “查询分析器”里面运行,是可以的…
#5
怀疑你程序连的数据库和“查询分析器”里连接的数据库不是一个。
在程序中使用
select * from A where ID = 5 试一试能不能取到数据。
另外B还有其它外键吗?
在程序中使用
select * from A where ID = 5 试一试能不能取到数据。
另外B还有其它外键吗?
#6
1,保证连得数据库是同一个
2, 虽然,我不能100%告诉您没有其他外键,但是至少错误提示的是 诸如 A 表的 ID 字段,所以至少目前的错误和其他的外键(假设有)没有关系
3, “select”方案 我测试一下
#7
"查询分析器" 里都运行了 肯定不会是sql的问题了
#8
能取到…
#9
愿听高见!!
#10
先给主键表插入数据
冲突发生于数据库那个表
冲突发生于数据库那个表
#11
不好意思,没太理解您的意思!!
我想说明的是,主键表中的记录已经存在了
------------------------
还是上面的列子
在 B表 中增加一条数据, 其中,字段 AID = 5
AID 的外键是 A 表中的 ID,而且 ID = 5 的记录已经存在了…
#12
忙乎半天把你代码贴出来吧。描述也不够清楚。如果主键正常存在,外键引用是不会不成功的。看你代码如何写的。
#13
还有你B表的外键关联是否恰当,这也很重要。把主键表和外键表截个图,一看就明白了
#14
你在哪儿出现这个问题的?
源代码里
在相关 执行语句 类似 executenonquery(sql) 放断点 语句放到一个try里
获取sql语句 在查询分析器 执行 如果正确,
f10 或 f11 逐行执行 看看有没有 捕捉到异常
从你的描述 简直见鬼了
源代码里
在相关 执行语句 类似 executenonquery(sql) 放断点 语句放到一个try里
获取sql语句 在查询分析器 执行 如果正确,
f10 或 f11 逐行执行 看看有没有 捕捉到异常
从你的描述 简直见鬼了
#15
非常同意您的观点!!
代码是很简单的
采用三层,下面的几句就是 UI 层执行的
co.Model.co_content fieldsInfo = new co.Model.co_content();
fieldsInfo .a_id = 1; // 就是这个字段有外键,我直接赋值一个已经在主键表中存在的值
……
co.BLL.co_content newContent = new co.BLL.co_content();
newContent .Add(fieldsInfo ); // 执行到这里,出错
我觉得意思应该是表达清楚了,代码的话,我还是可以肯定不会有问题的!
个人的想法:
是否与 ASP.NET 与 SQL Server 某种机制有关,所以需要额外的代码;当然这种想法完全是个人猜测!
#16
你用的Entity FrameWork?
#17
Entity FrameWork的话需要。
在edmx中建立两个表的Assocation. 然后A就成了B的Navigation Properties.
赋值的时候要
B b = new B();
A a = GetByID(5); //通过ID取得A的实例
B.a = a; //赋值
newContent .Add(fieldsInfo );
newContent.SaveChanges();
在edmx中建立两个表的Assocation. 然后A就成了B的Navigation Properties.
赋值的时候要
B b = new B();
A a = GetByID(5); //通过ID取得A的实例
B.a = a; //赋值
newContent .Add(fieldsInfo );
newContent.SaveChanges();
#18
您好,我是初学者,不是很理解这个东西的作用!!
对于您说的 Entity FrameWork,我刚刚了解了以下
--------------------------------------------------
" ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表。"
--------------------------------------------------
其中所提到的 VS 2008, .NET 3.5 都是符合我现在的环境。
————————————————————
其实,我目前的业务处理方面,把外键删除了也没关系,这不过是基于对技术本身的探讨,想知道是为什么,所以才在求教各位!!
还请各位不吝赐教!!
#19
谢谢!!
我先尝试一下…
#20
做个transection吧
#21
路过顶!!!
#22
#23
哥,还是一样的问题!!
---------------------------
INSERT 语句与 FOREIGN KEY 约束"FK__co_plan_c__plan___04E4BC85"冲突。该冲突发生于数据库"co",表"dbo.co_plan", column 'plan_id'。
语句已终止。
#24
建议不要设置什么东西,这样容易出问题
#25
非常感谢您的建议!!
我在之前 #18 的时候说明过这个问题,目前讨论这个问题,属纯技术讨论,和业务无关!!
#26
各位:
有一个新的信息,有兴趣的可以继续研究!!
之前出现错误,我添加是采用:
public int Add(co.Model.co_content model)
{
return dal.Add(model);
}
但是我重载该方法如以下模式后,就没有问题:
public int Add(int aid, string con /* 更多 */)
{
co.Model.co_content contentModel = new co.Model.co_content();
contentModel.aid = aid;
contentModel.con = con;
// ……
return dal.Add(contentModel);
}
补充:
系统结构:
UI, BLL, DAL, MODEL …
#27
兄弟,我刚刚遇到你这样的问题。我看了你这帖子。不过我的问题是我自己解决的。
也是外键的作用。
我的问题解决是这样的:(希望对你有用)
找到你所定义的第二个表 B,点设计,找到你表A 的 id 这个字段,点右键--选关系
会出现一个外键关系的 窗口。里面有个标识,下面有表设计器,在表设计器下有个
INSERT 和UPDATE 规范, 将 强制外键约束 选为否
我的是这么修改后就可以了。
希望对你有用!
也是外键的作用。
我的问题解决是这样的:(希望对你有用)
找到你所定义的第二个表 B,点设计,找到你表A 的 id 这个字段,点右键--选关系
会出现一个外键关系的 窗口。里面有个标识,下面有表设计器,在表设计器下有个
INSERT 和UPDATE 规范, 将 强制外键约束 选为否
我的是这么修改后就可以了。
希望对你有用!
#28
你好在哪里修改
#29
27楼正解
#30
顶一下27楼,不错,我纠结了很久。。。
#31
我也遇到了这个问题,用27楼的方法成功了。
我用的是ms sql management studio express,在外键上点右键点修改,找到“强制外键约束”,改为否即可。
我用的是ms sql management studio express,在外键上点右键点修改,找到“强制外键约束”,改为否即可。
#32
27楼正解,多谢了
#33
谢谢27楼,解决了
#1
因为你插入的这个外键,这那个表找不到对应的数据。
比如你增加B.aid这个字段,但aid在A表中没有对应的数据,所以报错
这就是外键的作用
比如你增加B.aid这个字段,但aid在A表中没有对应的数据,所以报错
这就是外键的作用
#2
外键约束起作用了,其实可以用代码来检测外键。
#3
谢谢,我问题中已经说到了
我要在 B 中增加一条数据, 其中,AID = 5
AID 的外键是 A 表中的 ID,而且 ID = 5 的记录已经存在了…
______________________________
莫非是我这样理解的“外键”概念是错误的??
#4
而且,我把同样的 SQL 语句直接放到 “查询分析器”里面运行,是可以的…
#5
怀疑你程序连的数据库和“查询分析器”里连接的数据库不是一个。
在程序中使用
select * from A where ID = 5 试一试能不能取到数据。
另外B还有其它外键吗?
在程序中使用
select * from A where ID = 5 试一试能不能取到数据。
另外B还有其它外键吗?
#6
1,保证连得数据库是同一个
2, 虽然,我不能100%告诉您没有其他外键,但是至少错误提示的是 诸如 A 表的 ID 字段,所以至少目前的错误和其他的外键(假设有)没有关系
3, “select”方案 我测试一下
#7
"查询分析器" 里都运行了 肯定不会是sql的问题了
#8
能取到…
#9
愿听高见!!
#10
先给主键表插入数据
冲突发生于数据库那个表
冲突发生于数据库那个表
#11
不好意思,没太理解您的意思!!
我想说明的是,主键表中的记录已经存在了
------------------------
还是上面的列子
在 B表 中增加一条数据, 其中,字段 AID = 5
AID 的外键是 A 表中的 ID,而且 ID = 5 的记录已经存在了…
#12
忙乎半天把你代码贴出来吧。描述也不够清楚。如果主键正常存在,外键引用是不会不成功的。看你代码如何写的。
#13
还有你B表的外键关联是否恰当,这也很重要。把主键表和外键表截个图,一看就明白了
#14
你在哪儿出现这个问题的?
源代码里
在相关 执行语句 类似 executenonquery(sql) 放断点 语句放到一个try里
获取sql语句 在查询分析器 执行 如果正确,
f10 或 f11 逐行执行 看看有没有 捕捉到异常
从你的描述 简直见鬼了
源代码里
在相关 执行语句 类似 executenonquery(sql) 放断点 语句放到一个try里
获取sql语句 在查询分析器 执行 如果正确,
f10 或 f11 逐行执行 看看有没有 捕捉到异常
从你的描述 简直见鬼了
#15
非常同意您的观点!!
代码是很简单的
采用三层,下面的几句就是 UI 层执行的
co.Model.co_content fieldsInfo = new co.Model.co_content();
fieldsInfo .a_id = 1; // 就是这个字段有外键,我直接赋值一个已经在主键表中存在的值
……
co.BLL.co_content newContent = new co.BLL.co_content();
newContent .Add(fieldsInfo ); // 执行到这里,出错
我觉得意思应该是表达清楚了,代码的话,我还是可以肯定不会有问题的!
个人的想法:
是否与 ASP.NET 与 SQL Server 某种机制有关,所以需要额外的代码;当然这种想法完全是个人猜测!
#16
你用的Entity FrameWork?
#17
Entity FrameWork的话需要。
在edmx中建立两个表的Assocation. 然后A就成了B的Navigation Properties.
赋值的时候要
B b = new B();
A a = GetByID(5); //通过ID取得A的实例
B.a = a; //赋值
newContent .Add(fieldsInfo );
newContent.SaveChanges();
在edmx中建立两个表的Assocation. 然后A就成了B的Navigation Properties.
赋值的时候要
B b = new B();
A a = GetByID(5); //通过ID取得A的实例
B.a = a; //赋值
newContent .Add(fieldsInfo );
newContent.SaveChanges();
#18
您好,我是初学者,不是很理解这个东西的作用!!
对于您说的 Entity FrameWork,我刚刚了解了以下
--------------------------------------------------
" ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表。"
--------------------------------------------------
其中所提到的 VS 2008, .NET 3.5 都是符合我现在的环境。
————————————————————
其实,我目前的业务处理方面,把外键删除了也没关系,这不过是基于对技术本身的探讨,想知道是为什么,所以才在求教各位!!
还请各位不吝赐教!!
#19
谢谢!!
我先尝试一下…
#20
做个transection吧
#21
路过顶!!!
#22
#23
哥,还是一样的问题!!
---------------------------
INSERT 语句与 FOREIGN KEY 约束"FK__co_plan_c__plan___04E4BC85"冲突。该冲突发生于数据库"co",表"dbo.co_plan", column 'plan_id'。
语句已终止。
#24
建议不要设置什么东西,这样容易出问题
#25
非常感谢您的建议!!
我在之前 #18 的时候说明过这个问题,目前讨论这个问题,属纯技术讨论,和业务无关!!
#26
各位:
有一个新的信息,有兴趣的可以继续研究!!
之前出现错误,我添加是采用:
public int Add(co.Model.co_content model)
{
return dal.Add(model);
}
但是我重载该方法如以下模式后,就没有问题:
public int Add(int aid, string con /* 更多 */)
{
co.Model.co_content contentModel = new co.Model.co_content();
contentModel.aid = aid;
contentModel.con = con;
// ……
return dal.Add(contentModel);
}
补充:
系统结构:
UI, BLL, DAL, MODEL …
#27
兄弟,我刚刚遇到你这样的问题。我看了你这帖子。不过我的问题是我自己解决的。
也是外键的作用。
我的问题解决是这样的:(希望对你有用)
找到你所定义的第二个表 B,点设计,找到你表A 的 id 这个字段,点右键--选关系
会出现一个外键关系的 窗口。里面有个标识,下面有表设计器,在表设计器下有个
INSERT 和UPDATE 规范, 将 强制外键约束 选为否
我的是这么修改后就可以了。
希望对你有用!
也是外键的作用。
我的问题解决是这样的:(希望对你有用)
找到你所定义的第二个表 B,点设计,找到你表A 的 id 这个字段,点右键--选关系
会出现一个外键关系的 窗口。里面有个标识,下面有表设计器,在表设计器下有个
INSERT 和UPDATE 规范, 将 强制外键约束 选为否
我的是这么修改后就可以了。
希望对你有用!
#28
你好在哪里修改
#29
27楼正解
#30
顶一下27楼,不错,我纠结了很久。。。
#31
我也遇到了这个问题,用27楼的方法成功了。
我用的是ms sql management studio express,在外键上点右键点修改,找到“强制外键约束”,改为否即可。
我用的是ms sql management studio express,在外键上点右键点修改,找到“强制外键约束”,改为否即可。
#32
27楼正解,多谢了
#33
谢谢27楼,解决了