gpt4 book ai didi

MySQL 触发器不完全工作

转载 作者:行者123 更新时间:2023-11-29 03:19:52 28 4
gpt4 key购买 nike

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

基本上(这是为了类(class)作业),我想要一个触发器,当将 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$$

最佳答案

如果 LocationTrigger 为 null,则 IF 中的表达式不会计算为 TRUE。

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

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

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

我们要允许 location 为 NULL 值吗?

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

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

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

假设“有效”位置由 Boss 表中的 location 值域定义,

假设我们不允许 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。

与 NULL 的“不等于”比较将评估为 NULL,而不是 TRUE 或 FALSE。

bool 逻辑是 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

关于MySQL 触发器不完全工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47044073/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com