gpt4 book ai didi

mysql - 在触发器中创建 View

转载 作者:行者123 更新时间:2023-11-29 13:53:41 25 4
gpt4 key购买 nike

我必须在更新触发器内的更新中使用 View (尚未创建,因为该更新触发器内需要它)。

这是我的代码:

CREATE TRIGGER lunghezza_sentiero_datoderivato_UPDATE2
AFTER UPDATE ON TAPPA
FOR EACH ROW
BEGIN

CREATE VIEW tempoOLD_NULL(IDsentiero, tempo) AS
SELECT IDsentiero, tempo
FROM SENTIERO
WHERE tempo IS NULL and SENTIERO.IDsentiero IN (SELECT DISTINCT IDsentiero
FROM SENTIERO__HA__TAPPA AS sht
WHERE NEW.IDtappa=sht.IDtappa);

CREATE VIEW lunghezzaOLD_NULL(IDsentiero, lunghezza) AS
SELECT IDsentiero, lunghezza
FROM SENTIERO
WHERE lunghezza IS NULL and SENTIERO.IDsentiero IN (SELECT DISTINCT IDsentiero
FROM SENTIERO__HA__TAPPA AS sht
WHERE NEW.IDtappa=sht.IDtappa);

IF (NEW.lunghezza<>OLD.lunghezza) and (NEW.lunghezza is not null) THEN

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

UPDATE SENTIERO
SET lunghezza=NEW.lunghezza
WHERE IDsentiero IN (SELECT IDsentiero
FROM lunghezzaOLD_NULL);



END IF;

当我评论 2 个 CREATE VIEW 时,所有运行...但我需要该 View ..所以,请帮助我! (在触发器外部创建 View ?但我需要在每次更新时创建一个 View ,因为 NULL 值会随着时间的推移而变化)

根据要求提供表格和示例的附录:

CREATE  TABLE IF NOT EXISTS `SENTIERO` (
`IDsentiero` INT(11) NOT NULL COMMENT 'identificativo del sentiero' ,
`lunghezza` FLOAT NULL COMMENT 'dato derivato' ,
`tempo` FLOAT NULL COMMENT 'dato derivato' ,
PRIMARY KEY (`IDsentiero`) );

CREATE TABLE IF NOT EXISTS `TAPPA` (
`IDtappa` INT(11) NOT NULL COMMENT 'identificativo tappa' ,
`lunghezza` FLOAT NULL COMMENT 'Lunghezza espressa in km' ,
`tempo` FLOAT NULL COMMENT 'La quantità di ore stimate per arrivare alla tappa' ,
PRIMARY KEY (`IDtappa`) );

CREATE TABLE IF NOT EXISTS `SENTIERO__HA__TAPPA` (
`IDtappa` INT(11) NOT NULL ,
`IDsentiero` INT(11) NOT NULL ,
PRIMARY KEY (`IDtappa`, `IDsentiero`) );

一个'TAPPA'可以包含在一个或多个'SENTIERO'中,一个'SENTIERO'包含一个或多个'TAPPA'。

每个'SENTIERO'都有其一个或多个'TAPPA'的'tempo'和'lunghezza'之和。因此,当“TAPPA”发生更新时,如果该“TAPPA”的“节奏”和“lunghezza”发生了变化,我想重新计算该“节奏”和“lunghezza”或更多与更新的'TAPPA'相关的'SENTIERO'

请参阅,'SENTIERO' 具有其自己的 'TAPPA'

的 SUM
SENTIERO                     |    SENTIERO_HA_TAPPA       |  TAPPA
IDsentiero tempo lunghezza | IDsentiero IDtappa | IDtappa tempo lunghezza
0 3 20 | 0 1 | 1 3 20
1 8 35 | 1 1 | 2 5 15
| 1 2 |

最佳答案

请勿将 View 用于此目的。这不是他们的目的。

相反,学习如何正确连接表:

CREATE TRIGGER lunghezza_sentiero_datoderivato_UPDATE2
AFTER UPDATE ON TAPPA
FOR EACH ROW

IF (NEW.lunghezza <> OLD.lunghezza) AND (NEW.lunghezza IS NOT NULL) THEN
-- note that this condition will not be entered if `OLD.lunghezza` IS NULL
-- irrespective of NEW.lunghezza. Perhaps you want to use the NULL-safe
-- equality operator <=> instead?

UPDATE SENTIERO AS s
JOIN SENTIERO__HA__TAPPA AS sht USING (IDsentiero)
SET s.lunghezza = CASE
WHEN s.lunghezza IS NULL THEN NEW.lunghezza
ELSE s.lunghezza - OLD.lunghezza + NEW.lunghezza
END
WHERE sht.IDtappa = NEW.IDtappa;

END IF

关于mysql - 在触发器中创建 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256250/

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