愤怒的TryCatch 2013-12-14 08:38
浏览 4544

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小时,还是没有找到解决问题。
希望各位大牛指点一二。拜谢!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 保护模式-系统加载-段寄存器