为什么mySQL触发器不保存?
我试图创建一个触发器,当两个具有相同“St_Obr”的插入已经完成时,该触发器将停止插入。它没有显示任何错误,但是当我执行SQL脚本时,触发器没有被保存。至少当我执行SHOW触发器时它没有显示 代码: 您希望在代码进行比较时将计数分配给变量。这将需要使用声明的变量,并在其中选择为什么mySQL触发器不保存?,mysql,sql,count,triggers,sql-insert,Mysql,Sql,Count,Triggers,Sql Insert,我试图创建一个触发器,当两个具有相同“St_Obr”的插入已经完成时,该触发器将停止插入。它没有显示任何错误,但是当我执行SQL脚本时,触发器没有被保存。至少当我执行SHOW触发器时它没有显示 代码: 您希望在代码进行比较时将计数分配给变量。这将需要使用声明的变量,并在其中选择 但是我发现跳过变量并直接在if语句中运行查询更简单: CREATE TRIGGER ob_limit BEFORE INSERT ON Lab FOR EACH ROW BEGIN IF ((SELEC
但是我发现跳过变量并直接在if
语句中运行查询更简单:
CREATE TRIGGER ob_limit
BEFORE INSERT ON Lab FOR EACH ROW
BEGIN
IF ((SELECT COUNT(*) FROM Lab WHERE St_Obr = NEW.St_Obr) >= 2) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'MAX 2!';
END IF;
END //
DELIMITER ;
请注意,我将不等式从
更改为=2
:前者允许每个St_Obr
三行,而后者仅允许2行(这似乎是您想要的)
这里有一个;您可以注释或取消注释第三个insert
以生成错误。在触发器之前的中,触发器中的SELECT count(*)…
语句无法“看到”插入的行。它是在新行插入表之前执行的。您可以按照GMB的建议,将限制降低到1
或使用=
。或者您可以将触发器更改为
触发器之后的
CREATE TRIGGER ob_limit
AFTER INSERT ON Lab
FOR EACH ROW
BEGIN
IF (SELECT count(*)
FROM Lab
WHERE st_obr = new.st_obr) > 2 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'MAX 2!';
END IF;
END //
DELIMITER ;
(请注意,您将结果分配给变量的方式也是错误的。但是不需要变量,您可以在比较中直接使用子查询。)谢谢您的更正,但执行后触发器仍然没有显示。@GašperŠtepec:我刚刚更改了答案,并添加了一个DB FIDLE。检查了您的解决方案,而且它也很有效。非常感谢。
CREATE TRIGGER ob_limit
AFTER INSERT ON Lab
FOR EACH ROW
BEGIN
IF (SELECT count(*)
FROM Lab
WHERE st_obr = new.st_obr) > 2 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'MAX 2!';
END IF;
END //
DELIMITER ;