如果在 SQlite 中删除触发器后结果为空,如何将值更新为 0?

How to update a value to 0 if the result is null after a delete trigger in SQlite?

我有 2 个 Sqlite tables,我们称它们为 mainsub

Main 有一个字段,它应该是子 table.

中具有相同代码的所有值的总和

所以如果 Main

CODE  | TOTAL_UNITS_AVAILABLE 
1            3
2            5

那么就是说在sub里面有这样的东西

INGREDIENT_CODE  | UNITS_AVAILABLE
     1              1
     1              2
     2              5

我在 sub 上为 INSERTUPDATEDELETE 设置了触发器,它们更新了 MainTOTAL_UNITS_AVAILABLE 的值使用 sub

上 inserted/updated/deleted 的代码进行记录

Insertupdate 工作正常,但是 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)

db<>fiddle