เหตุใดทริกเกอร์จึงทำการลบโดยไม่จำเป็นหลังจากการสืบค้นใน sql

ฉันมีสองตาราง:

  1. สั่งซื้อและ
  2. ผลิตภัณฑ์.

ฉันต้องการให้คอลัมน์เฉพาะ (OnShelfQuantity) ในตารางผลิตภัณฑ์ได้รับการอัปเดตเมื่อมีการเพิ่มแถวใหม่ในตารางคำสั่งซื้อ ฉันได้ใช้แบบสอบถามด้านล่างเพื่อใช้ทริกเกอร์ซึ่งจะทำเช่นนั้น แต่ปัญหาคือเมื่อฉันแทรกแถวในตาราง Order แล้วตรวจสอบตาราง Product เพื่อดูการเปลี่ยนแปลงในภายหลัง ฉันสังเกตเห็นว่าตาราง Product ได้รับการอัพเดตถึง 3 ครั้ง ตัวอย่างเช่น: ปริมาณการสั่งซื้อที่แทรก = 10 ดังนั้นควรลบเพียง 10 เท่านั้นจาก Product_TAB.OnShelfQuantity แต่ 30 โดนลบ. กรุณาช่วย!

create trigger dbo.Trigge
ON dbo.Ordertable
AFTER INSERT 
AS
BEGIN
update Product_TAB set OnShelfQuantity= Product_TAB.OnShelfQuantity - Ordertable.Quantity
FROM dbo.Product_TAB
  INNER JOIN Ordertable
  ON Ordertable.ProductID = Product_TAB.ProductID;
END;

person Muhammad Salman Ali    schedule 11.01.2021    source แหล่งที่มา
comment
คุณใช้ dbms ใด? (รหัสนั้นเป็นรหัสเฉพาะของผลิตภัณฑ์)   -  person jarlh    schedule 11.01.2021
comment
@jarth เซิร์ฟเวอร์ SQL และฉันใช้ SSMS เพื่อนำโค้ดไปใช้   -  person Muhammad Salman Ali    schedule 11.01.2021
comment
ตารางผลิตภัณฑ์ได้รับการอัปเดต 3 ครั้ง ... Ordertable มีสามแถวสำหรับ ProductID ที่กำหนดหรือไม่ คุณอาจต้องการอ่านข้อมูลใน inserted และ deleted ตารางเสมือน ที่ใช้ในทริกเกอร์   -  person AlwaysLearning    schedule 11.01.2021
comment
ทริกเกอร์นี้น่าจะใช้งานได้ดีที่สุดกับมุมมองที่จัดทำดัชนีไว้   -  person Charlieface    schedule 11.01.2021
comment
@AlwaysLearning ขอบคุณมาก!   -  person Muhammad Salman Ali    schedule 11.01.2021
comment
@Charlieface ขอบคุณมาก!   -  person Muhammad Salman Ali    schedule 11.01.2021
comment
คุณต้องการดำเนินการสำหรับคำถามของคุณหรือไม่?   -  person Charlieface    schedule 11.01.2021


คำตอบ (3)


ฉันคิดว่าคุณสามารถใช้ตาราง INSERTED เพื่อแก้ไขปัญหานี้ได้

ตารางที่แทรก คือตารางที่ทริกเกอร์ใช้เพื่อจัดเก็บบันทึกที่แทรกบ่อยในตาราง

ดังนั้นคุณสามารถใช้สิ่งเดียวกันในคำสั่งอัปเดตของคุณเพื่อหลีกเลี่ยงปัญหานี้

update Product_TAB set OnShelfQuantity= Product_TAB.OnShelfQuantity - 
Ordertable.Quantity
FROM dbo.Product_TAB
INNER JOIN Ordertable  ON Ordertable.ProductID = Product_TAB.ProductID
INNER JOIN inserted INS ON INS.Order_ID=Ordertable.Order_ID
person Thiyagu    schedule 11.01.2021
comment
ไม่มีเหตุผลที่จะเข้าร่วมในตารางคำสั่งซื้อ - ทุกสิ่งที่คุณต้องการจากตารางนั้นอยู่ในตารางที่แทรกไว้ในทริกเกอร์ AFTER - person SMor; 11.01.2021

คุณสามารถมีหลายแถวในตาราง inserted และแถวเหล่านี้อาจมีผลคูณเดียวกัน แถวในตารางเป้าหมายได้รับการอัปเดตเพียง หนึ่งครั้ง ในคำสั่ง update ดังนั้น คุณต้องการรวมข้อมูลก่อน update:

create trigger dbo.Trigge
ON dbo.Ordertable
AFTER INSERT 
AS
BEGIN    
    update p
        set OnShelfQuantity= p.OnShelfQuantity - i.total_quantity
        from dbo.Product_TAB p JOIN
             (SELECT i.ProductId, SUM(i.Quantity) as total_quantity
              FROM inserted i
              GROUP BY i.ProductId
             ) i
             on i.ProductID = p.ProductID;
END;

โปรดทราบว่านี่ใช้เฉพาะ inserted และไม่ใช่ตารางดั้งเดิม

person Gordon Linoff    schedule 11.01.2021

ปัญหาคือฉันกำลังแทรกแถวใหม่ แต่มีรหัสคำสั่งซื้อเดียวกัน นี่คือสาเหตุว่าทำไมมันถึงลบเพิ่มเติม ซึ่งผมไม่ต้องการ. ตอนนี้ฉันต้องแทรกแถวใหม่แต่มี OrderID ที่ไม่ซ้ำใคร ขอบคุณทุกคนที่ตอบข้างต้น!

person Muhammad Salman Ali    schedule 11.01.2021