我的触发器回来时没有错误。但是当我测试它时,没有返回错误消息,测试数据存储在表中..这不是我想要的。
基本上(这是课程作业),我想要一个触发器,当 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$$
答案 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