在对另一个表进行更新后,如何更新表中的列?
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
【讨论】:
以上是关于在对另一个表进行更新后,如何更新表中的列?的主要内容,如果未能解决你的问题,请参考以下文章