gpt4 book ai didi

mysql - 更新触发失败后

转载 作者:行者123 更新时间:2023-11-30 01:35:31 24 4
gpt4 key购买 nike

首先,创建触发器:

CREATE TRIGGER UpdateSentiero_AfterUpdatingTappa
AFTER UPDATE ON TAPPA
FOR EACH ROW
BEGIN

//NEW.tempo and OLD.tempo would refers to TAPPA "tempo" and "lunghezza", really? I ask you this because SENTIERO has it own "tempo" and "lunghezza"
IF (NEW.tempo is not null) and NOT (NEW.tempo=OLD.tempo) THEN

UPDATE SENTIERO
SET tempo=0;

END IF;
END$$

然后,运行查询:

UPDATE SENTIERO
SET tempo=null;

触发器似乎不起作用,我不知道原因。

NEW.tempo 和 OLD.tempo 可能为 NULL(我想它们指的是 TAPPA,因为它是 TAPPA 上的触发器),这就是我编写 IF 条件的原因。

<小时/>

编辑::

一个 SENTIERO 实例有多个 TAPPA 实例,因此一个 SENTIERO 实例收集它自己的“节奏”和“lunghezza”TAPPA 实例的值

IF (NEW.tempo is not null) and NOT (NEW.tempo=OLD.tempo) THEN

IF (OLD.tempo is NOT NULL) THEN

UPDATE SENTIERO
SET tempo=tempo - OLD.tempo + NEW.tempo
WHERE (tempo is NOT NULL) and IDsentiero IN ( SELECT DISTINCT IDsentiero
FROM SENTIERO__HA__TAPPA AS sht
WHERE NEW.IDtappa=sht.IDtappa);
ELSE

UPDATE SENTIERO
SET tempo=tempo + NEW.tempo
WHERE (tempo is NOT NULL) and IDsentiero IN ( SELECT DISTINCT IDsentiero
FROM SENTIERO__HA__TAPPA AS sht
WHERE NEW.IDtappa=sht.IDtappa);

UPDATE SENTIERO
SET tempo=NEW.tempo
WHERE (tempo is NULL) and IDsentiero IN ( SELECT DISTINCT IDsentiero
FROM SENTIERO__HA__TAPPA AS sht
WHERE NEW.IDtappa=sht.IDtappa);
END IF;


END IF;

但是当我尝试运行

UPDATE TAPPA
SET tempo=9
WHERE IDtappa=0;
//where instance of IDtappa=0 has "tempo"'s value=NULL

这不起作用

<小时/>

表格数据:

SENTIERO              |    SENTIERO_HA_TAPPA       |  TAPPA
IDsentiero time | IDsentiero IDtappa | IDtappa time
0 7.5 | 0 0 | 0 null
| 0 1 | 1 1.45
| 0 2 | 2 2.3
| 0 5 | 5 1.45
| 0 8 | 8 2.3

第一次(在 Tappa 上更新,设置 tempo=2,其中 IDtappa=0)触发器不起作用

注意:OLD.tempo 为 NULL,SENTIERO.tempo 不为 null

但第二次(在 Tappa 上更新,设置 tempo=3,其中 IDtappa=0)触发器工作

派生数据根据 SENTIERO 的“节奏”计算,IDsentiero=0,已更改:8.5

看起来它已经做到了:7.5 - 2 +3,所以看起来它已经采取了正确的条件。

注意:OLD.tappa 不为空,SENTIERO.tempo 不为空

所以问题出在 TAPPA.tempo 的 NULL 值

最佳答案

您的查询不会触发触发器。原因如下:

CREATE TRIGGER UpdateSentiero_AfterUpdatingTappa
AFTER UPDATE ON TAPPA

触发器仅在对表 TAPPA 进行更新后触发。

UPDATE SENTIERO
SET tempo=null;

您的测试查询正在更新表 SENTIERO,并将 tempo 设置为 null,该查询将被触发器的 IF 条件过滤掉。尝试更新 TAPPA,如下所示:

UPDATE TAPPA
SET tempo=5;

假设该表中的节奏值 != 5,此查询应导致 SENTIERO 的节奏值设置为零。

请注意,您的触发器似乎会影响 SENTIERO 中的每一行。也许您应该在两个表之间添加某种 ID 匹配?例如:

UPDATE SENTIERO 
SET tempo=0
WHERE SENTIERO.ID = NEW.ID;
<小时/>

回答新问题:

您的 IF 语句:

IF (NEW.tempo is not null) and NOT (NEW.tempo=OLD.tempo) THEN

您的测试查询:

UPDATE TAPPA
SET tempo=9
WHERE IDtappa=0;
//where instance of IDtappa=0 has "tempo"'s value=NULL

根据注释,很明显没有输入 IF block 。您正在将非空值与空值进行比较。这会产生 null。您需要使用the null safe equality operator , <=> 。您的 IF 语句应如下所示:

IF (NEW.tempo is not null) and NOT (NEW.tempo<=>OLD.tempo) THEN

关于mysql - 更新触发失败后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16944569/

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