愤怒的TryCatch 2013-12-14 08:38 采纳率: 0%
浏览 4545

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

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-01 15:29
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在SQL Server中,当执行insert操作时,如果数据已经存在于数据库中,并且与当前插入的数据具有相同的主键(即primary key),那么触发器就会阻止insert操作并回滚事务。

    你的问题是在处理StockInfo表中的StockInfo列和SellTab表中的ProID列时发生的。由于你正在尝试插入一个新的记录到StockInfo表,这个新记录的ProID字段应该等于SellTab表中的某个已存在的ProID,以避免主键冲突。

    要解决这个问题,你需要确保每次insert操作都满足以下条件:

    1. StockInfo表中的ProID列与SellTab表中的ProID列相匹配。
    2. 如果匹配成功,则删除StockInfo表中的对应记录。

    你可以通过在触发器中增加检查来实现这一点。例如,可以使用IF EXISTS语句来检查是否有匹配的记录,然后根据结果决定是否删除或更新现有记录。下面是一个可能的解决方案:

    CREATE TRIGGER tri_insert_stock_info
    ON StockInfo
    FOR INSERT
    AS
    BEGIN
        IF NOT EXISTS(SELECT * FROM StockInfo WHERE ProID = NEW.ProID)
            BEGIN
                DELETE FROM StockInfo WHERE ProID = NEW.ProID;
                INSERT INTO SellTab VALUES(NEW.ProID, NEW.SellNumber);
            END
        ELSE
            BEGIN
                UPDATE StockInfo SET ProNumber = ProNumber - NEW.SellNumber WHERE ProID = NEW.ProID;
            END
    END
    

    请注意,这只是一个示例,实际应用中可能需要根据具体情况进行调整。此外,这个例子假设所有的StockInfoSellTab表都有一个共同的主键,即ProID。如果你的表有不同的主键,或者StockInfo表中有多个不同的ProID,则可能需要对触发器做相应的修改。

    评论

报告相同问题?