当前位置: 首页 > 面试题库 >

插入后使用触发器更新多行(SQL Server)

昝晗昱
2023-03-14
问题内容

我有一个表orderDetails,其中包含订单的产品

  • productId
  • color
  • size
  • quantity

和一桌股票

  • productId
  • size
  • color
  • stock

订单完成后,我将使用此查询在表格中插入商品 orderDetails

INSERT INTO orderDetail(orderId, productId, productColor, productSize, productQuantity , cost productName)
    SELECT     
       @orderId, products_translations.id, cart.productColor, cart.productSize, 
       cart.productQuantity, cart.cost, products_translations.name
    FROM cart 
    INNER JOIN products_translations ON cart.productID = products_translations.id
    WHERE     
        (cart.cartId = @cartId) AND 
        (products_translations.language = 1)

然后我在表上有一个触发器orderDetails

ALTER TRIGGER [dbo].[scalaProdotti]
   ON [dbo].[orderDetail]
   FOR INSERT
AS

DECLARE @size int
DECLARE @color char(6)
DECLARE @quantity int
DECLARE @product int

BEGIN
    SELECT @size = productSize FROM inserted
    SELECT @color = productColor FROM inserted
    SELECT @quantity = productQuantity FROM inserted
    SELECT @product = productId FROM inserted
    UPDATE stock SET quantity =  quantity - @quantity WHERE size=@size AND color=@color AND product=@product
END

通过此触发器,我想减少库存,但是只有第一个产品受到影响,其他数量保持不变。

我想念什么?

谢谢你。


问题答案:

要点是:您假设将为插入的每一行调用触发器- 情况并非如此

每个语句 将调用 一次 触发器-但是该语句可以一次插入多个行。

在这种情况下,Inserted触发器内的表将包含 多行 和您的语句:

SELECT @size = productSize FROM inserted
SELECT @color = productColor FROM inserted
SELECT @quantity = productQuantity FROM inserted
SELECT @product = productId FROM inserted

将会失败或碰巧只选择插入的第一行而忽略其余的插入。

你需要重写你的扳机,以应付这一事实Inserted可以包含 多个插入的行 同时

触发器中的代码应如下所示:

UPDATE stock 
FROM Inserted i
SET 
     stock.quantity = quantity - i.quantity 
WHERE 
     stock.size = i.size 
     AND stock.color = i.color 
     AND stock.product = i.product


 类似资料:
  • 问题内容: 我有两个表,其中一个命名如下 另一个表具有以下字段: SID CID Per 如何为以下内容编写触发器: 如果表h1-h0的任何字段中发生 更新,则使用以下值更新表中的列: ((总数为1s-总数为0s / (总数1s +总数0s))/ 100 在此先感谢 我开发了一个触发器,但是它不起作用,它在第11行说了错误,您能说出什么问题吗? 问题答案: 在定义触发器之前,请确保更改定界符。另外

  • 问题内容: 我的数据库中有一个计算,需要在更新触发器之后为“ table1”更新“ field1”。 更新该字段的问题将导致更新后触发器触发并执行冗长的过程并显示错误。 请告知在执行“更新后”触发器之后如何使“ field1”更新,而又不使“更新后”触发器再次执行。 我知道我不能将After触发器与NEW配合使用。 谢谢 问题答案: 可以使用基于上下文变量的自定义锁定机制,以防止重复调用AFTER

  • 问题内容: 我目前正在创建某种库存系统。 我在哪里保存项目。在中,我有一栏或剩余的可用库存。 tbl1: 我还有一个表,我将所有交易保存在该表中。在这张桌子上有。 tbl2 我的问题是如何在UPDATE的同时插入一行。 例如:当我在request_by,product和qty_issued中插入记录时,我希望可以自动更新。因为我们向John发出了2(数量)的鼠标。tbl1中的鼠标记录应自动减少到“

  • 问题内容: 由于MySQL忽略了检查约束,如何使用触发器来阻止插入或更新的发生? 例如: 表foo有一个称为agency的属性,并且agency属性只能是1、2、3、4或5。 还是有更好的方法来进行MySQL中的检查约束? 问题答案: 尝试SIGNAL语法-https: //dev.mysql.com/doc/refman/5.5/en/signal.html 编辑 根据Bill Karwin下面

  • 问题内容: 只是一个简单的问题,毫无疑问,有人会知道答案。 我需要能够在触发器中进行多次插入/更新。每次尝试都以失败告终:( 目前,上面的代码只是在插入父表时在表中插入一行。这很好。 为了使它与多种价值观一起工作,我需要做 但是…一定有更简单的方法吗?当我尝试使用; 终止每个语句,它失败并带有 我什至无法使多个更新语句起作用。 如果有人可以指出我在做什么错,那将是很大的帮助? 干杯 加文 问题答案

  • 问题内容: 这是我想做的事情: 当表中有新记录时,我需要通过设置以表示特定(旧)帐户已被编辑来更新where =中的行。 要求 不是 我要操纵 新插入的 列,而是要使用一个 已经存在的 列 但是,我无法更新同一张表: 请提出解决方法 PS:我已经走过了更新表触发器在同一个表更新后,插入到相同的表触发的mysql,更新与后同桌INSERT触发器和表后插入MySQL的触发器与插入和更新,但他们似乎没有