【发布时间】:2021-04-30 11:04:02
【问题描述】:
我只想在 NEW 中的特定值存在且不为空时执行我的 MySQL(MariaDB) 触发器。
如何将触发器包装在 if 子句中,以检查新插入是否包含一个值,例如 Name。因此,如果有一个新的插入或更新查询未设置字段Name,我不想运行触发器。
我试过了
IF NEW.Name IS NOT NULL
BEGIN
...
END
但它不起作用。
我的实际触发代码确实正确使用了 NEW 中的值。
我的触发器是这样的。
INSERT INTO Produkte (Textilkennzeichen, Produktnummer, Bestand, createdAt, updatedAt)
VALUES (NEW.Textilkennzeichen, NEW.Produktnummer,
@Bestand := (
SELECT IFNULL(SUM(`Anzahl`), 0)
FROM Eintragungen
WHERE Produziert = true
AND Textilkennzeichen = NEW.Textilkennzeichen
AND Produktnummer = NEW.Produktnummer
)
-
((
SELECT IFNULL(SUM(`Anzahl`), 0)
FROM Eintragungen
WHERE Verkauf = true
AND Textilkennzeichen = NEW.Textilkennzeichen
AND Produktnummer = NEW.Produktnummer
)
+
(
SELECT IFNULL(SUM(`Anzahl`), 0)
FROM Eintragungen
WHERE Schenkung = true
AND Textilkennzeichen = NEW.Textilkennzeichen
AND Produktnummer = NEW.Produktnummer
)
+
(
SELECT @amount_r := IFNULL(SUM(`Anzahl`), 0)
FROM Eintragungen
WHERE Reklamation = true
AND Textilkennzeichen = NEW.Textilkennzeichen
AND Produktnummer = NEW.Produktnummer
)), NOW(), NOW())
ON DUPLICATE KEY UPDATE Bestand = @Bestand
【问题讨论】:
-
为什么不把
IF放在BEGIN/END块中,让它成为触发器的一部分? -
if 的正确语法是 IF...THEN...ENDIF;
-
@GordonLinoff 我实际上并没有在我使用的数据库应用程序中写
BEGIN/END。我直接从INSERT开始,但如果我把IF NEW.Name IS NOT NULL放在开头,它也不起作用。 -
@P.Salmon 我也不能使用
IFTHENEND IF。我收到以下错误。您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在第 37 行的“END IF”附近使用的正确语法。我正在使用 Sequel Pro 来管理我的数据库。 -
IF NEW.Name IS NOT NULL THEN {your INSERT query}; END IF;
标签: mysql sql database triggers mariadb