在对另一个表进行更新后,如何更新表中的列?

Posted

技术标签:

【中文标题】在对另一个表进行更新后,如何更新表中的列?【英文标题】:How can I update a column in a table after there has been an update to another table? 【发布时间】:2021-02-08 21:28:57 【问题描述】:

所以我有一个名为 orders 的表,它有一个 id 列。然后我有 order_lines,它有一个名为 order_id 的列来引用回订单,它还有一个 product_id 列来引用另一个名为 products 的表,其中包含定价信息。

我想要它,以便自动计算订单小计字段以获得所有产品价格的总和 * order_lines 和产品的数量。我正在尝试在 SQLite 中创建一个触发器来执行此操作,但我不断收到错误。

这给了我“END”附近的语法错误:

CREATE TRIGGER tSubTotal
AFTER
UPDATE OF quantity
    ON order_lines 
    BEGIN
UPDATE
    o
SET
    subtotal = (
        select
            SUM(p.price * ol.quantity) as subtotal
        from
            order_lines ol
            join products p on ol.product_id = p.id
        where
            ol.order_id = i.id
    )
FROM
    inserted i
    INNER JOIN orders o ON o.id = i.id
END;

但是,当指定订单 ID 时,仅此查询确实会提取我想要的数据:

select
            SUM(p.price * ol.quantity) as subtotal
        from
            order_lines ol
            join products p on ol.product_id = p.id
        where
            ol.order_id = 1

更新: 我最终创建了一个触发器来计算每个 order_line 的总价格,但现在我想创建另一个触发器来汇总 total_price 以更新订单的小计。

CREATE TRIGGER tTotalPrice
UPDATE
ON order_lines
BEGIN
UPDATE order_lines
    SET total_price = 
        (NEW.quantity) *
                   (SELECT p.price FROM products p WHERE p.id = order_lines.product_id)
    WHERE order_lines.id = NEW.id;
END;

【问题讨论】:

【参考方案1】:

在 SQLite 中,我希望触发逻辑是这样的:

UPDATE orders o
    SET subtotal = (NEW.quantity - OLD.quantity) *
                   (SELECT p.price FROM products WHERE p.id = ol.product_id)
    WHERE o.id = NEW.order_id;

您的大部分代码与 SQLite 几乎没有关系。

【讨论】:

我按照这里的文档建模了我的代码:sqlite.org/lang_createtrigger.html。在我看来,你的不是一个完整的触发器 @Cole 。 . .这不是一个完整的触发器。这是触发器主体的逻辑。 对,但是该查询根本没有连接到 order_lines 表,因此触发器总是会失败,因为它无法识别这些字段 我最终使用您提到的 NEW 运算符更新了我的,但它仍然不完全完美。 CREATE TRIGGER tSubtotal UPDATE ON order_lines BEGIN UPDATE orders SET subtotal = (SELECT SUM(p.price * ol.quantity) from order_lines ol join products p on ol.product_id = p.id where ol.order_id = NEW.order_id ) WHERE 订单。 id = NEW.order_id;结束 我最终创建了一个触发器来计算每个 order_line 的总价格,但现在我想创建另一个触发器来对 total_price 求和以更新订单的小计。在 order_lines 上创建触发器 tTotalPrice 更新 BEGIN UPDATE order_lines SET total_price = (NEW.quantity) * (SELECT p.price FROM products p WHERE p.id = order_lines.product_id) WHERE order_lines.id = NEW.id;结束;【参考方案2】:

我能够创建两个触发器来工作。一个更新 order_lines 中的 total_price,另一个在第一个触发器运行后更新订单中的小计。

CREATE TRIGGER tTotalPrice
UPDATE
ON order_lines
BEGIN
UPDATE order_lines
    SET total_price = 
        (NEW.quantity) *
                   (SELECT p.price FROM products p WHERE p.id = order_lines.product_id)
    WHERE order_lines.id = NEW.id;
END;
CREATE TRIGGER tSubtotal
AFTER UPDATE
ON order_lines
BEGIN
UPDATE orders
    SET subtotal =  (select sum(total_price) from order_lines ol where order_id = NEW.order_id)
    WHERE orders.id = NEW.order_id;
END

【讨论】:

以上是关于在对另一个表进行更新后,如何更新表中的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用窗口函数更新表中的列

插入后使用 SQL Server 触发器更新另一个表中的列

如何使用计数查询来(自动)更新表中的列

如何根据从另一个表中选择的结果更新一个表中的列

SQL UPDATE - 如何使用另一个表更新一个表中的列?

SQL:根据另一个表的计数结果更新一个表中的列