如何检查变量是否为空,如果为空则将其设置为零
how to check if Variable is null and set it to zero if it is null
我有两个 table,分别是 Table Item List
和 Table Rekod
。我尝试创建一个触发器,该触发器将更新 table item_list
中特定项目的数量,无论记录是否更新。但是我在输入第一条记录时遇到了问题。触发器将不起作用。它仅在 add 和 minus 记录都已存在时才有效。我尝试了这个,但似乎我也无法再更新我的 rekod
table
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
DECLARE add INT;
DECLARE minus INT;
DECLARE final INT;
SET add =
SELECT (SELECT SUM(rekod.quantity) from rekod where rekod.status = "add" &&rekod.SKU=item_list.SKU )
FROM item_list ;
SET minus =
SELECT (SELECT SUM(rekod.quantity) from rekod where rekod.status = "minus" &&rekod.SKU=item_list.SKU )
FROM item_list ;
IF add IS NULL
THEN
SET add = 0;
END IF;
IF minus IS NULL
THEN
SET minus = 0;
END IF;
SET final = add - minus;
UPDATE item_list SET Quantity = final;
END;
//
delimiter ;```
如果有充分的理由在对 rekod 进行更新时同步所有时间列表,例如 "when we update rekod we change 10000 rows at a time"
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
BEGIN
UPDATE
item_list
INNER JOIN (SELECT sku, SUM(CASE WHEN status = 'add' THEN quantity ELSE -quantity END) as s FROM rekod) x
ON x.sku = item_list.sku
SET item_list.quantity = x.s;
END;
//
delimiter;
或者为了保持项目列表逐行同步,例如 "we only ever update one item at a time in rekod"
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
UPDATE
item_list
SET quantity = (SELECT SUM(CASE WHEN status = 'add' THEN quantity ELSE -quantity END) as s FROM rekod WHERE sku = new.sku)
WHERE sku = new.sku;
END;
//
delimiter;
不确定您对插入做了什么 - 我认为 rekod 的工作方式类似于历史记录 table,只有一长串加和减
就我个人而言,我只是想知道余额而不是尝试保持项目列表同步
测试每一行的状态并确定是否添加或减去就足够了
喜欢
DELIMITER //
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
IF NEW.status = "add" THEN
SET @add = NEW.quantity;
ELSE
SET @add = - NEW.quantity;
END IF;
UPDATE item_list SET Quantity = Quantity + @add WHERE sku = new.sku;
END;
//
delimiter ;
我有两个 table,分别是 Table Item List
和 Table Rekod
。我尝试创建一个触发器,该触发器将更新 table item_list
中特定项目的数量,无论记录是否更新。但是我在输入第一条记录时遇到了问题。触发器将不起作用。它仅在 add 和 minus 记录都已存在时才有效。我尝试了这个,但似乎我也无法再更新我的 rekod
table
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
DECLARE add INT;
DECLARE minus INT;
DECLARE final INT;
SET add =
SELECT (SELECT SUM(rekod.quantity) from rekod where rekod.status = "add" &&rekod.SKU=item_list.SKU )
FROM item_list ;
SET minus =
SELECT (SELECT SUM(rekod.quantity) from rekod where rekod.status = "minus" &&rekod.SKU=item_list.SKU )
FROM item_list ;
IF add IS NULL
THEN
SET add = 0;
END IF;
IF minus IS NULL
THEN
SET minus = 0;
END IF;
SET final = add - minus;
UPDATE item_list SET Quantity = final;
END;
//
delimiter ;```
如果有充分的理由在对 rekod 进行更新时同步所有时间列表,例如 "when we update rekod we change 10000 rows at a time"
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
BEGIN
UPDATE
item_list
INNER JOIN (SELECT sku, SUM(CASE WHEN status = 'add' THEN quantity ELSE -quantity END) as s FROM rekod) x
ON x.sku = item_list.sku
SET item_list.quantity = x.s;
END;
//
delimiter;
或者为了保持项目列表逐行同步,例如 "we only ever update one item at a time in rekod"
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
UPDATE
item_list
SET quantity = (SELECT SUM(CASE WHEN status = 'add' THEN quantity ELSE -quantity END) as s FROM rekod WHERE sku = new.sku)
WHERE sku = new.sku;
END;
//
delimiter;
不确定您对插入做了什么 - 我认为 rekod 的工作方式类似于历史记录 table,只有一长串加和减
就我个人而言,我只是想知道余额而不是尝试保持项目列表同步
测试每一行的状态并确定是否添加或减去就足够了
喜欢
DELIMITER //
CREATE TRIGGER update_quantity AFTER UPDATE ON rekod
FOR EACH ROW
BEGIN
IF NEW.status = "add" THEN
SET @add = NEW.quantity;
ELSE
SET @add = - NEW.quantity;
END IF;
UPDATE item_list SET Quantity = Quantity + @add WHERE sku = new.sku;
END;
//
delimiter ;