MySQL触发器无法正常工作

时间:2017-10-31 20:31:36

标签: mysql triggers location signals message

我的触发器回来时没有错误。但是当我测试它时,没有返回错误消息,测试数据存储在表中..这不是我想要的。

基本上(这是课程作业),我想要一个触发器,当 Barcelona 以外的位置插入表格时,会显示错误消息。

这是我的触发器。正如我所说,没有错误回来,但它不起作用?

DELIMITER $$

CREATE TRIGGER after_location_insert_finance
AFTER INSERT ON Finance
FOR EACH ROW

BEGIN  
DECLARE LocationTrigger varchar(255);  
DECLARE msg varchar(255);  

SELECT Location INTO LocationTrigger  
FROM Finance  
WHERE Location != "Barcelona";  

IF(LocationTrigger != "Barcelona") THEN  
SIGNAL SQLSTATE '45000'  
SET MESSAGE_TEXT = 'Not a valid location';  
END IF;

END$$

1 个答案:

答案 0 :(得分:0)

如果IF为空,则LocationTrigger中的表达式不会评估为TRUE。

如果Boss中的行没有满足WHERE子句中的条件,则LocationTrigger将为NULL。

我不明白为什么没有检查插入location列的值;或者,当我们与Boss的字面值进行比较时,为什么我们会对'Barcelona'表格进行查询。

似乎我们希望在BEFORE触发器而不是AFTER触发器中进行此类检查。

我们是否允许location的空值?

如果我们允许为location插入的唯一值是'Barcelona',如果我们不允许使用NULL值,那么我们就不需要弄乱任何查询Boss表的。只是做一个比较...

 BEGIN
    IF NOT ( NEW.location <=> 'Barcelona' ) THEN
       SIGNAL ...
    END IF;
 END

触发器的目标可能是强制执行参照完整性约束(我们通常通过声明FOREIGN KEY约束来实现,而不是实现过程。)

假设&#34;有效&#34; location由location表中的Boss值域定义,

并假设我们不允许NULL值,那么:

BEGIN
   DECLARE ls_location  VARCHAR(255) DEFAULT NULL;
   -- check if the value being inserted exists in a lookup table
   SELECT b.location INTO ls_location
     FROM Boss b
    WHERE b.location = NEW.location
    LIMIT 1 
   ;
   -- if we didn't find a match, ls_location will be NULL
   IF ls_location IS NULL THEN 
      SIGNAL ... 
   END IF;
END

如果在Boss中找不到匹配的行,则ls_location将为NULL。

A&#34;不等于&#34;与NULL的比较将评估为NULL,而不是TRUE或FALSE。

布尔逻辑是SQL三值的... TRUE,FALSE和NULL

 SELECT 0     = 1      AS c0
      , 0    <> 1      AS c1
      , 0     = NULL   AS c2
      , 0    <> NULL   AS c3
      , NULL  = NULL   AS c4
      , NULL <> NULL   AS c5