【发布时间】:2020-01-22 17:41:11
【问题描述】:
只是不明白为什么会抛出这个错误:
ERROR 1064 (42000):您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的“END”附近使用的正确语法
触发器定义如下:
CREATE TRIGGER `aaa`
BEFORE INSERT ON `aaa_table`
FOR EACH ROW
BEGIN
IF (`NEW.field1` LIKE 'ABC-%')
AND
(SELECT COUNT(1) FROM `aaa_table`
WHERE `aaa_table.field2` = `NEW.field2`
AND `aaa_table.field3` = `NEW.field3`) > 0
THEN
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Verify Insert Failed - record Exists!'
END IF;
IF (`NEW.field1` NOT LIKE 'ABC-%')
AND
(SELECT COUNT(1) FROM `aaa_table`
WHERE `aaa_table.field2` = `NEW.field2`
AND `aaa_table.field4` = `NEW.field4`) > 0
THEN
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Verify Insert Failed - record Exists!'
END IF;
END
有人可以帮忙吗?
我也很高兴听到任何改进这种语法的想法。我正在尝试验证基于 field1 值的记录的唯一性 - 它的 LIKE 'ABC-%' 那么不应有超过一行具有相同的 field2 和 field3,否则不应该有多于一行具有相同的字段 2 和字段 4。 试图通过虚拟列来实现,但无法在这样的列上定义唯一键。
更新:
我尝试了@Baram 的建议:
CREATE TRIGGER `aaa`
BEFORE INSERT ON `aaa_table`
FOR EACH ROW
BEGIN
IF (NEW.`field1` LIKE 'ABC-%')
AND
(SELECT COUNT(1) FROM `aaa_table`
WHERE `aaa_table`.`field2` = NEW.`field2`
AND `aaa_table`.`field3` = NEW.`field3`) > 0
THEN
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Verify Insert Failed - record Exists!';
END IF;
IF (NEW.`field1` NOT LIKE 'ABC-%')
AND
(SELECT COUNT(1) FROM `aaa_table`
WHERE `aaa_table`.`field2` = NEW.`field2`
AND `aaa_table`.`field4` = NEW.`field4`) > 0
THEN
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = 'Verify Insert Failed - record Exists!';
END IF;
END
但不断出现同样的错误。有什么想法吗?
谢谢!
更新 2
找到了问题,希望对遇到同样问题的人有所帮助:
我必须添加分隔符定义,这样查询就不会在分号上分成几个。
【问题讨论】:
-
你不应该在
NEW.field1周围有反引号,它们应该在field1周围。 -
语法错误是因为在
END IF之前的行尾需要;。
标签: mysql