Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么mySQL触发器不保存?_Mysql_Sql_Count_Triggers_Sql Insert - Fatal编程技术网

为什么mySQL触发器不保存?

为什么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

我试图创建一个触发器,当两个具有相同“St_Obr”的插入已经完成时,该触发器将停止插入。它没有显示任何错误,但是当我执行SQL脚本时,触发器没有被保存。至少当我执行SHOW触发器时它没有显示

代码:

您希望在代码进行比较时将计数分配给变量。这将需要使用声明的变量,并在其中选择

但是我发现跳过变量并直接在
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 ;