MS SQL Server和MySQL:插入更新时触发(增加)

MS SQL Server和MySQL:插入更新时触发(增加),mysql,sql,sql-server,Mysql,Sql,Sql Server,我有药店数据库 2个表: Drug :DID , DNumder(is Drug inventory) Buy_Drug:BID(Autoincrement) , DID , Bnumber(is number of Purchase) 我想要一个触发器: 当插入Buy_Drug示例B编号=10时,增加D编号=D编号+10更新药物 例如: Buy_Drug: Drug: BID DID Bnumber D

我有药店数据库

2个表:

Drug :DID , DNumder(is Drug inventory)
Buy_Drug:BID(Autoincrement) , DID ,  Bnumber(is number of Purchase)
我想要一个触发器: 当插入Buy_Drug示例B编号=10时,增加D编号=D编号+10更新药物

例如:

Buy_Drug:                           Drug:
BID   DID  Bnumber                DID   Dnumber
1     123   44                    111      10
2     111   10                    199       0
当插入购买药品投标时=3 DID=123 B编号=40 更新药物:DID=123 Dnumber=44+40=88

在我的扳机里* Dnumber=44+44=88通过插入的第一条记录进行平均更新 可惜我的扳机坏了

我的扳机*:

create trigger drug_buy
on Buy_Drug
After Insert
as
begin
    Update  Drug
    Set Dnumber=Dnumber+Bnumber
    From Drug JOIN Bying_Drug
    on Drug.DID=Bying_Drug.DID
end

请帮助我编写一个工作触发器?

假设
SqlServer
,您将需要使用
插入的
(可能还有
删除的
)伪表来执行此操作。当然还要注意,
Buy_Drug
的DML(更新、插入等)可以包括多行更新!:

create trigger drug_buy
on Buy_Drug
After Insert
as
begin
    Update  Drug
      Set Dnumber=Dnumber + i.Bnumber
      From Drug JOIN INSERTED i
        on Drug.DID=i.DID
end

但是,也就是说,在触发器中执行此操作不是一个好主意,例如,因为它不是并发安全的,即2次同时插入可能会导致库存计算错误。您还需要向下计数的机制,例如退款。在最好的情况下,触发更新的库存水平只是指示性的,如果定期对所有数据进行重新分析,则需要更准确地重新确定库存水平。

标签和标题相互矛盾-
SqlServer
MySql
?User370211:第一优先级Sql server--secound MySql--Tanx a lot不要在触发器中执行此操作。创建一个汇总已售出单位和已购买单位的视图。这将为您提供库存金额。存储它并在每次插入/更新时重新计算是不必要的、低效的和容易出错的。@GarethD这取决于更新的数量,而不是要报告的项目数量以及可以使用视图的架构的报告数量。对于单个请求,这应该非常快,因为它只能在
buy
sell
表上使用索引搜索。尽管正如已经指出的那样,在某些情况下,触发器是维持报告的最佳方式,但这些都是(海事组织)边缘案例。虽然即使在这些边缘情况下,我个人还是宁愿找到一个替代使用触发器的方法。。。。谢谢你的回答-非常快,非常感谢再次欢迎你,但是,根据评论,请承诺仔细重新考虑触发器是否是这里的正确工具。请问Mysql代码是什么?Tanxxxxxxxxxxxxxxxxxxxx有很多MySql触发器的示例,例如。伪表被称为
New
Old
,每一行都有
循环糖。“请承诺仔细重新考虑触发器是否是这里的正确工具”:我认为是的触发器是这里的正确工具-你怎么认为?