插入时违反主键约束,请问怎样解决?

u013643226 2014-02-13 07:01:42
t1表主键xid自增,可是插入时报错,提示违反了t2表主键约束(t2表主键xid不自增),不能在对象中插入重复键。我不理解,现在这两个表的xid最大值相同,为什么向t1插入数据时,会报这个错呢?
...全文
1281 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
u013643226 2014-02-17
  • 打赏
  • 举报
回复
触发器的代码需要修改,因为使用的数据库引擎不是当前的,所以不停的报错img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/20.gif][/img]。 各位的回帖让我大有收获,太谢谢了!!!
u013643226 2014-02-14
  • 打赏
  • 举报
回复
谢谢,回头试试!
中国风 2014-02-14
  • 打赏
  • 举报
回复
把你的两个表结构贴出来看看。 在表1 AppID建主健就行了 表2建外健不需要建主健
LongRui888 2014-02-14
  • 打赏
  • 举报
回复
引用 20 楼 u013643226 的回复:
alter TRIGGER [dbo].[tr_Insert2] ON [dbo].[t1] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- if @@rowcount = 0 --如果影响的行数为 0,则结束触发器运行,避免占用资源 -- return -- Insert statements for trigger here INSERT INTO [abc].[dbo].[t2] ([AppID] ,[AppStatus]) VALUES (@@IDENTITY --(select max(appid) from inserted) ,0); -- Insert statements for trigger here INSERT INTO [abc].[M].[t2] ([AppID] ,[AppStatus]) VALUES (@@IDENTITY --(select max(appid) from inserted) ,0) end 这是执行结果,“违反了 PRIMARY KEY 约束 'PK_T2'。不能在对象 'dbo.t2' 中插入重复键。”
改成这样就报子查询错误吗:
alter TRIGGER [dbo].[tr_Insert2]
   ON  [dbo].[t1]
   AFTER INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--    if @@rowcount = 0 --如果影响的行数为 0,则结束触发器运行,避免占用资源
--      return
    -- Insert statements for trigger here
INSERT INTO [abc].[dbo].[t2]
           ([AppID]
           ,[AppStatus])
     VALUES
           (
           (select max(appid) from inserted) 
           ,0);
           
    -- Insert statements for trigger here
INSERT INTO [abc].[M].[t2]
           ([AppID]
           ,[AppStatus])
     VALUES
           (
           (select max(appid) from inserted) 
           ,0)
end
u013643226 2014-02-14
  • 打赏
  • 举报
回复
alter TRIGGER [dbo].[tr_Insert2] ON [dbo].[t1] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- if @@rowcount = 0 --如果影响的行数为 0,则结束触发器运行,避免占用资源 -- return -- Insert statements for trigger here INSERT INTO [abc].[dbo].[t2] ([AppID] ,[AppStatus]) VALUES (@@IDENTITY --(select max(appid) from inserted) ,0); -- Insert statements for trigger here INSERT INTO [abc].[M].[t2] ([AppID] ,[AppStatus]) VALUES (@@IDENTITY --(select max(appid) from inserted) ,0) end 这是执行结果,“违反了 PRIMARY KEY 约束 'PK_T2'。不能在对象 'dbo.t2' 中插入重复键。”
LongRui888 2014-02-14
  • 打赏
  • 举报
回复
引用 18 楼 u013643226 的回复:
服务器引擎是2005,如果哪里设置一下是不是就行了?
这个子查询,是没问题的,不需要设置,自动支持的基本功能,你把修改完的触发器代码,再贴出来一下,、
u013643226 2014-02-14
  • 打赏
  • 举报
回复
服务器引擎是2005,如果哪里设置一下是不是就行了?
LongRui888 2014-02-14
  • 打赏
  • 举报
回复
引用 16 楼 u013643226 的回复:
试了一下,“在此上下文中不允许使用子查询。” 这是在t1插入记录后执行的触发器里的代码,怎样设置就可以执行子查询了呢?
我用的是sql server 2008R2的可以的,你不可以吗,应该是可以的
u013643226 2014-02-14
  • 打赏
  • 举报
回复
试了一下,“在此上下文中不允许使用子查询。” 这是在t1插入记录后执行的触发器里的代码,怎样设置就可以执行子查询了呢?
LongRui888 2014-02-14
  • 打赏
  • 举报
回复
引用 12 楼 u013643226 的回复:
alter TRIGGER [dbo].[tr_InsertManage] ON [dbo].[tbApplication] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; INSERT INTO [database].[dbo].[t2] ([AppID] ,[AppStatus]) VALUES (--@@IDENTITY scope_identity() ,0 ); INSERT INTO [database].[Manage].[txxxxx] ([AppID] ,[AppStatus]) VALUES (--@@IDENTITY scope_identity() ,0) ...... end
把这个触发器修改一下: alter TRIGGER [dbo].[tr_InsertManage] ON [dbo].[tbApplication] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; INSERT INTO [database].[dbo].[t2] ([AppID] ,[AppStatus]) VALUES (--@@IDENTITY (select xid from inserted) ,0 ); INSERT INTO [database].[Manage].[txxxxx] ([AppID] ,[AppStatus]) VALUES (--@@IDENTITY (select xid from inserted) ,0) ...... end
chen870201 2014-02-14
  • 打赏
  • 举报
回复
单纯的数据问题
u013643226 2014-02-14
  • 打赏
  • 举报
回复
把@@identity替换成scope_identity之后,提示信息不一样了。
u013643226 2014-02-14
  • 打赏
  • 举报
回复
alter TRIGGER [dbo].[tr_InsertManage] ON [dbo].[tbApplication] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; INSERT INTO [database].[dbo].[t2] ([AppID] ,[AppStatus]) VALUES (--@@IDENTITY scope_identity() ,0 ); INSERT INTO [database].[Manage].[txxxxx] ([AppID] ,[AppStatus]) VALUES (--@@IDENTITY scope_identity() ,0) ...... end
LongRui888 2014-02-14
  • 打赏
  • 举报
回复
引用 10 楼 u013643226 的回复:
还是不行,“不能将值 NULL 插入列 'xID',表 'xxxSystem.dbo.t2';列不允许有空值。INSERT 失败。” 这个触发器需要在执行t1插入时,对好几个表进行插入xid的操作。 这个问题不解决,可测试不了,汗呀!
要不你把触发器代码,贴出来看看把。
u013643226 2014-02-14
  • 打赏
  • 举报
回复
还是不行,“不能将值 NULL 插入列 'xID',表 'xxxSystem.dbo.t2';列不允许有空值。INSERT 失败。” 这个触发器需要在执行t1插入时,对好几个表进行插入xid的操作。 这个问题不解决,可测试不了,汗呀!
發糞塗牆 2014-02-14
  • 打赏
  • 举报
回复
引用 6 楼 u013643226 的回复:
有触发器,插入t1操作时触发,向t2表里的xid字段插入@@IDENTITY。而且要往好几个关联的表里xid字段插入@@IDENTITY呢。
如果是单一操作都报错,就跟@@identity没什么关系
LongRui888 2014-02-14
  • 打赏
  • 举报
回复
引用 23 楼 u013643226 的回复:
表的结构大致是这样,没什么特殊的地方 t1(xid int,......apptime datetime), t2(xid int,......appstatus int) t1.xid主键,自增,t2.xid主键
你有qq吗,方便的话,帮你看看
u013643226 2014-02-14
  • 打赏
  • 举报
回复
表的结构大致是这样,没什么特殊的地方 t1(xid int,......apptime datetime), t2(xid int,......appstatus int) t1.xid主键,自增,t2.xid主键
LongRui888 2014-02-13
  • 打赏
  • 举报
回复
引用 6 楼 u013643226 的回复:
有触发器,插入t1操作时触发,向t2表里的xid字段插入@@IDENTITY。而且要往好几个关联的表里xid字段插入@@IDENTITY呢。
你的代码是不是这样的,先往t1插入数据,t1中有identity自增列,然后你就通过t1的触发器,自动往t2等其他表中插入数据是吧,用的是@@identity对吧。 这个@@identity是有问题的哦,在同时又多个插入的时候,可能会导致插入相同的数据的。 你把@@identity修改成 scope_identity() 函数把
u013643226 2014-02-13
  • 打赏
  • 举报
回复
有触发器,插入t1操作时触发,向t2表里的xid字段插入@@IDENTITY。而且要往好几个关联的表里xid字段插入@@IDENTITY呢。
加载更多回复(5)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧