如果在 SQlite 中删除触发器后结果为空,如何将值更新为 0?
How to update a value to 0 if the result is null after a delete trigger in SQlite?
我有 2 个 Sqlite tables,我们称它们为 main
和 sub
。
Main
有一个字段,它应该是子 table.
中具有相同代码的所有值的总和
所以如果 Main
有
CODE | TOTAL_UNITS_AVAILABLE
1 3
2 5
那么就是说在sub
里面有这样的东西
INGREDIENT_CODE | UNITS_AVAILABLE
1 1
1 2
2 5
我在 sub
上为 INSERT
、UPDATE
和 DELETE
设置了触发器,它们更新了 Main
中 TOTAL_UNITS_AVAILABLE
的值使用 sub
上 inserted/updated/deleted 的代码进行记录
Insert
和 update
工作正常,但是 DELETE
有一个问题,如果 sub
中带有 X 主代码的每条记录都被删除,金额的总和in main 更新为 NULL
.
我尝试了以下方法来阻止它,但它不起作用:
CREATE TRIGGER UpdateAmountAvailable_UPDATE
AFTER DELETE ON Sub
BEGIN
UPDATE Main
SET
TOTAL_UNITS_AVAILABLE = (
SELECT
CASE SUM(A.UNITS_AVAILABLE)
WHEN NULL THEN 0
WHEN 0 THEN 0
ELSE SUM(A.UNITS_AVAILABLE)
END
FROM Sub AS A
WHERE A.INGREDIENT_CODE = old.INGREDIENT_CODE
) WHERE CODE = old.INGREDIENT_CODE;
END
有没有我可以尝试的解决方法?
Sqlite 有一个非标准的聚合函数TOTAL
The sum() and total() aggregate functions return sum of all non-NULL
values in the group. If there are no non-NULL input rows then sum()
returns NULL but total() returns 0.0.
CREATE TRIGGER UpdateAmountAvailable_DELETE
AFTER DELETE ON Sub
BEGIN
UPDATE Main
SET TOTAL_UNITS_AVAILABLE = (
SELECT TOTAL(A.UNITS_AVAILABLE)
FROM Sub AS A
WHERE A.INGREDIENT_CODE = old.INGREDIENT_CODE
)
WHERE CODE = old.INGREDIENT_CODE;
END
使用标准 SUM 函数的结果是 COALESCE(SUM(A.UNITS_AVAILABLE), 0)
我有 2 个 Sqlite tables,我们称它们为 main
和 sub
。
Main
有一个字段,它应该是子 table.
所以如果 Main
有
CODE | TOTAL_UNITS_AVAILABLE
1 3
2 5
那么就是说在sub
里面有这样的东西
INGREDIENT_CODE | UNITS_AVAILABLE
1 1
1 2
2 5
我在 sub
上为 INSERT
、UPDATE
和 DELETE
设置了触发器,它们更新了 Main
中 TOTAL_UNITS_AVAILABLE
的值使用 sub
Insert
和 update
工作正常,但是 DELETE
有一个问题,如果 sub
中带有 X 主代码的每条记录都被删除,金额的总和in main 更新为 NULL
.
我尝试了以下方法来阻止它,但它不起作用:
CREATE TRIGGER UpdateAmountAvailable_UPDATE
AFTER DELETE ON Sub
BEGIN
UPDATE Main
SET
TOTAL_UNITS_AVAILABLE = (
SELECT
CASE SUM(A.UNITS_AVAILABLE)
WHEN NULL THEN 0
WHEN 0 THEN 0
ELSE SUM(A.UNITS_AVAILABLE)
END
FROM Sub AS A
WHERE A.INGREDIENT_CODE = old.INGREDIENT_CODE
) WHERE CODE = old.INGREDIENT_CODE;
END
有没有我可以尝试的解决方法?
Sqlite 有一个非标准的聚合函数TOTAL
The sum() and total() aggregate functions return sum of all non-NULL values in the group. If there are no non-NULL input rows then sum() returns NULL but total() returns 0.0.
CREATE TRIGGER UpdateAmountAvailable_DELETE
AFTER DELETE ON Sub
BEGIN
UPDATE Main
SET TOTAL_UNITS_AVAILABLE = (
SELECT TOTAL(A.UNITS_AVAILABLE)
FROM Sub AS A
WHERE A.INGREDIENT_CODE = old.INGREDIENT_CODE
)
WHERE CODE = old.INGREDIENT_CODE;
END
使用标准 SUM 函数的结果是 COALESCE(SUM(A.UNITS_AVAILABLE), 0)