2 a406502972 a406502972 于 2013.12.14 16:38 提问

SQL触发器进行更新操作时 用insert添加发生主键冲突

环境:SQLserver 2008

创建的表
--库存表(还有多少商品)ID 名称 库存数量 --销售表(卖了多少商品)ID 销售数量
create table StockInfo
(
ProID int primary key identity(1,1),
ProName nvarchar(20) not null,
ProNumber int not null
)
go

create table SellTab--销售表
(
ProID int references StockInfo(ProID),
SellNumber int not null
)
go

insert into StockInfo values('可口可乐',500)
insert into StockInfo values('统一来一桶老坛酸菜牛肉面',300)
insert into StockInfo values('泡面搭档',600)
insert into StockInfo values('加多宝',800)

** 创建的触发器 **

--创建一个触发器 首先判断触发器是否存在
if exists (select * from sysobjects where name = 'tri_inset_sellInfo')
drop trigger tri_inset_sellInfo
go
create trigger tri_inset_sellInfo
on SellTab
for insert
as
--声明变量来存插入的值 插入的值可以在逻辑表inserted 里面找到,其表的结构和被触发器作用的表的结构时一样的
declare @id int , @number int ,@AfterNumber int
select @id = proId ,@number=sellNumber from inserted
update StockInfo set ProNumber = ProNumber -@number where ProID = @id
select @afterNumber = proNumber from stockInfo where ProID = @Id
if(@afterNumber <0)
begin
--操作失败进行事务回滚
rollback transaction
print 'SORRY 执行失败'
end
go

set nocount on --不显示T-SQL语句返回的行数
insert into SellTab values(5,1000)

** 以上为全部代码 **
这是以前学校老师发给我们练手的,但是现在复习的时候遇到这个问题了,百度了1小时,还是没有找到解决问题。
希望各位大牛指点一二。拜谢!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
UPDATE操作出现主键冲突错误
UPDATE操作出现主键冲突错误,如果出现了这样的问题,你一定会感到匪夷所思! mysql> UPDATE `GC_Price` SET `Price` = '155.00', `OptTime` = '2013-07-01 16:12:36', `CRCode` = '0109' WHERE (PRID = 364706189); ERROR 1062 (23000): Duplicate
创建INSERT、DELETE、UPDATE 触发器示例 .
触发器是基于一个表创建的,但是可以针对多个表进行操作。所以触发器可以用来对表实施复杂的完整性的约束,当触发器所保存的数据发生改变时,触发器所保存的数据发生改变时,触发器被自动激活,从而防止对数据的不正确修改。         下面对每个INSERT、DELETE、UPDATE触发器举一个小例子来加深理解: INSERT触发器:         INSERT触发器就是当对定义触发器的表执行IN
触发器解决外键约束问题
触发器是与表事件有关的特殊存储过程。它不能直接被执行,必须为表上的增、删、改事件所触发。外键要比触发器更快,但是我们经常会遇见外键约束的问题,触发器能解决外键不能处理的复杂关系。下面是一个实践的例子: 一、背景     在牛腩发布系统中,三个表(新闻类别、新闻、评论)之间的关系是一对多的关系,每个新闻类别可以有多条新闻,每条新闻可以有多条评论,主键为相应的id号,关系图如下:
sql server中添加数据是发生外键约束冲突的问题
在sql server中添加数据时发生了外键约束冲突: 原因:没有理解外键的概念,涉及到外键时,一定有一个参照关系和被参照关系,也就是有一个参照表和被参照表。 如创建两个表:Student和SC表,SC表中有一列Sno,Sno是SC表的外键,同时Sno也是Student表的主键,因此在向SC 表中添加数据时,SC表中的数据就会参照Student表中的数据,解决方案是:在向SC表中添加数据之前,
创建触发器 字段自增长
利用序列产生主键值。  序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量增长的值。序列可以循环,或者是连续增加的,直到指定的最大值为止。  创建序列语法如下
sql server触发器实现插入时操作另一张表
以前都是也得mysql,现在写sqlserver的触发器,感觉改动还是蛮大的 1.定义变量 #在mysql中变量直接这么定义就可以了 SET @VALUE = "111"; #在sql server中 declare @count int; #并赋值 set @count =0; #如果是查询,必须这么些 select @count = count(*) from WQ_MNINF_D_RE
关于触发器对扩展表插入操作引发的违反主键的唯一约束条件
今天在写了一个行级update触发器,对表进行插入的时,触发触发器对扩展表做插入操作。遇到的问题不是一般的多。 1)在触发器的匿名块部分中用了 insert into tab_a(col_a1)  select col_b1 from tab_b  where col_b1= :new.col_b1; tab_a为触发器的扩展表,tab_a为触发器的作用表。触发器写完之后,执行成功,然后执行:
用触发器实现主键值自增
序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量增长的值。序列可以循环,或者是连续增加的,直到指定的最大值为止。  创建序列语法如下:create sequenc
2017.9.15 postgresql批量插入造成冲突后执行更新
参考来自:https://stackoverflow.com/questions/40647600/postgresql-multi-value-upserts/46233907#46233907   1.before insert   2.insert sql   3.after insert   注意这里有两个容易出错的点:1.如果label字段不是必填的,要注意语
创建INSERT、DELETE、UPDATE 触发器示例
触发器是基于一个表创建的,但是可以针对多个表进行操作。所以触发器可以用来对表实施复杂的完整性的约束,当触发器所保存的数据发生改变时,触发器所保存的数据发生改变时,触发器被自动激活,从而防止对数据的不正确修改。         下面对每个INSERT、DELETE、UPDATE触发器举一个小例子来加深理解: INSERT触发器:         INSERT触发器就是当对定义触发器的表执行IN