INSERT 语句与 COLUMN FOREIGN KEY 约束 冲突

时间:2022-04-03 00:34:34

有劳各位,目前的一个问题:

有外键约束的两个表,主表,约束表

首先在主表中插入了数据,然后再在被约束表中插入相应的数据,还是提示如题所示错误。

打个比方:

表 A,  字段  ID

表 B,  字段  AID

B.AID 约束于 A.ID

我现在要在 B 表中插入一条数据, B.AID 的值, 在 A 表中已经存在

插入一条带有 B.AID = 5 的记录,此时  A.ID = 5 的记录已经存在了


但是还是如题所示错误…


补充:

不好意思,个人对数据库的了解并不是很专业,所以在表述上或存在不准确的地方,请见谅!

但是,我相信大家是能理解意思的,有劳各位指教!!!

33 个解决方案

#1


因为你插入的这个外键,这那个表找不到对应的数据。
比如你增加B.aid这个字段,但aid在A表中没有对应的数据,所以报错
这就是外键的作用

#2


外键约束起作用了,其实可以用代码来检测外键。

#3


引用 1 楼 nosuchtracter 的回复:
因为你插入的这个外键,这那个表找不到对应的数据。
比如你增加B.aid这个字段,但aid在A表中没有对应的数据,所以报错
这就是外键的作用


谢谢,我问题中已经说到了

我要在 B 中增加一条数据, 其中,AID = 5

AID 的外键是  A 表中的 ID,而且 ID = 5 的记录已经存在了…


______________________________

莫非是我这样理解的“外键”概念是错误的??

#4



 而且,我把同样的 SQL 语句直接放到 “查询分析器”里面运行,是可以的…

#5


怀疑你程序连的数据库和“查询分析器”里连接的数据库不是一个。

在程序中使用

select * from A where ID = 5 试一试能不能取到数据。

另外B还有其它外键吗?

#6


引用 5 楼 findcaiyzh 的回复:
怀疑你程序连的数据库和“查询分析器”里连接的数据库不是一个。

在程序中使用

select * from A where ID = 5 试一试能不能取到数据。

另外B还有其它外键吗?


1,保证连得数据库是同一个

2, 虽然,我不能100%告诉您没有其他外键,但是至少错误提示的是  诸如  A 表的 ID 字段,所以至少目前的错误和其他的外键(假设有)没有关系

3, “select”方案 我测试一下

#7


"查询分析器" 里都运行了     肯定不会是sql的问题了

#8


引用 5 楼 findcaiyzh 的回复:
select * from A where ID = 5 试一试能不能取到数据。


能取到…

#9


引用 7 楼 wyq29 的回复:
"查询分析器" 里都运行了     肯定不会是sql的问题了


愿听高见!!

#10


先给主键表插入数据
冲突发生于数据库那个表

#11


引用 10 楼 wuyq11 的回复:
先给主键表插入数据
冲突发生于数据库那个表


不好意思,没太理解您的意思!!

我想说明的是,主键表中的记录已经存在了

------------------------

还是上面的列子

在 B表 中增加一条数据, 其中,字段 AID = 5

AID 的外键是 A 表中的 ID,而且 ID = 5 的记录已经存在了…

#12


忙乎半天把你代码贴出来吧。描述也不够清楚。如果主键正常存在,外键引用是不会不成功的。看你代码如何写的。

#13


还有你B表的外键关联是否恰当,这也很重要。把主键表和外键表截个图,一看就明白了

#14


你在哪儿出现这个问题的?

源代码里   

在相关 执行语句 类似 executenonquery(sql)  放断点   语句放到一个try里 

获取sql语句  在查询分析器  执行  如果正确,

f10   或 f11 逐行执行  看看有没有 捕捉到异常

从你的描述  简直见鬼了

#15


引用 12 楼 rock870210 的回复:
忙乎半天把你代码贴出来吧。描述也不够清楚。如果主键正常存在,外键引用是不会不成功的。看你代码如何写的。


非常同意您的观点!!

代码是很简单的

采用三层,下面的几句就是 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();

#18


引用 16 楼 findcaiyzh 的回复:
你用的Entity FrameWork?


您好,我是初学者,不是很理解这个东西的作用!!

对于您说的  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


引用 17 楼 findcaiyzh 的回复:
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.……


谢谢!!

我先尝试一下…

#20


做个transection吧

#21


路过顶!!!

#22


该回复于2010-07-27 16:09:35被版主删除

#23


引用 17 楼 findcaiyzh 的回复:
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.……



哥,还是一样的问题!!

---------------------------
INSERT 语句与 FOREIGN KEY 约束"FK__co_plan_c__plan___04E4BC85"冲突。该冲突发生于数据库"co",表"dbo.co_plan", column 'plan_id'。
语句已终止。

#24


建议不要设置什么东西,这样容易出问题

#25


引用 24 楼 jhdxhj 的回复:
建议不要设置什么东西,这样容易出问题


非常感谢您的建议!!

我在之前 #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 规范, 将 强制外键约束 选为否
我的是这么修改后就可以了。
希望对你有用!

#28


你好在哪里修改

#29


27楼正解

#30


顶一下27楼,不错,我纠结了很久。。。

#31


我也遇到了这个问题,用27楼的方法成功了。

我用的是ms sql management studio express,在外键上点右键点修改,找到“强制外键约束”,改为否即可。

#32


27楼正解,多谢了

#33


谢谢27楼,解决了

#1


因为你插入的这个外键,这那个表找不到对应的数据。
比如你增加B.aid这个字段,但aid在A表中没有对应的数据,所以报错
这就是外键的作用

#2


外键约束起作用了,其实可以用代码来检测外键。

#3


引用 1 楼 nosuchtracter 的回复:
因为你插入的这个外键,这那个表找不到对应的数据。
比如你增加B.aid这个字段,但aid在A表中没有对应的数据,所以报错
这就是外键的作用


谢谢,我问题中已经说到了

我要在 B 中增加一条数据, 其中,AID = 5

AID 的外键是  A 表中的 ID,而且 ID = 5 的记录已经存在了…


______________________________

莫非是我这样理解的“外键”概念是错误的??

#4



 而且,我把同样的 SQL 语句直接放到 “查询分析器”里面运行,是可以的…

#5


怀疑你程序连的数据库和“查询分析器”里连接的数据库不是一个。

在程序中使用

select * from A where ID = 5 试一试能不能取到数据。

另外B还有其它外键吗?

#6


引用 5 楼 findcaiyzh 的回复:
怀疑你程序连的数据库和“查询分析器”里连接的数据库不是一个。

在程序中使用

select * from A where ID = 5 试一试能不能取到数据。

另外B还有其它外键吗?


1,保证连得数据库是同一个

2, 虽然,我不能100%告诉您没有其他外键,但是至少错误提示的是  诸如  A 表的 ID 字段,所以至少目前的错误和其他的外键(假设有)没有关系

3, “select”方案 我测试一下

#7


"查询分析器" 里都运行了     肯定不会是sql的问题了

#8


引用 5 楼 findcaiyzh 的回复:
select * from A where ID = 5 试一试能不能取到数据。


能取到…

#9


引用 7 楼 wyq29 的回复:
"查询分析器" 里都运行了     肯定不会是sql的问题了


愿听高见!!

#10


先给主键表插入数据
冲突发生于数据库那个表

#11


引用 10 楼 wuyq11 的回复:
先给主键表插入数据
冲突发生于数据库那个表


不好意思,没太理解您的意思!!

我想说明的是,主键表中的记录已经存在了

------------------------

还是上面的列子

在 B表 中增加一条数据, 其中,字段 AID = 5

AID 的外键是 A 表中的 ID,而且 ID = 5 的记录已经存在了…

#12


忙乎半天把你代码贴出来吧。描述也不够清楚。如果主键正常存在,外键引用是不会不成功的。看你代码如何写的。

#13


还有你B表的外键关联是否恰当,这也很重要。把主键表和外键表截个图,一看就明白了

#14


你在哪儿出现这个问题的?

源代码里   

在相关 执行语句 类似 executenonquery(sql)  放断点   语句放到一个try里 

获取sql语句  在查询分析器  执行  如果正确,

f10   或 f11 逐行执行  看看有没有 捕捉到异常

从你的描述  简直见鬼了

#15


引用 12 楼 rock870210 的回复:
忙乎半天把你代码贴出来吧。描述也不够清楚。如果主键正常存在,外键引用是不会不成功的。看你代码如何写的。


非常同意您的观点!!

代码是很简单的

采用三层,下面的几句就是 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();

#18


引用 16 楼 findcaiyzh 的回复:
你用的Entity FrameWork?


您好,我是初学者,不是很理解这个东西的作用!!

对于您说的  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


引用 17 楼 findcaiyzh 的回复:
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.……


谢谢!!

我先尝试一下…

#20


做个transection吧

#21


路过顶!!!

#22


该回复于2010-07-27 16:09:35被版主删除

#23


引用 17 楼 findcaiyzh 的回复:
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.……



哥,还是一样的问题!!

---------------------------
INSERT 语句与 FOREIGN KEY 约束"FK__co_plan_c__plan___04E4BC85"冲突。该冲突发生于数据库"co",表"dbo.co_plan", column 'plan_id'。
语句已终止。

#24


建议不要设置什么东西,这样容易出问题

#25


引用 24 楼 jhdxhj 的回复:
建议不要设置什么东西,这样容易出问题


非常感谢您的建议!!

我在之前 #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 规范, 将 强制外键约束 选为否
我的是这么修改后就可以了。
希望对你有用!

#28


你好在哪里修改

#29


27楼正解

#30


顶一下27楼,不错,我纠结了很久。。。

#31


我也遇到了这个问题,用27楼的方法成功了。

我用的是ms sql management studio express,在外键上点右键点修改,找到“强制外键约束”,改为否即可。

#32


27楼正解,多谢了

#33


谢谢27楼,解决了