【问题标题】:Use Procedure and Trigger to update a table使用过程和触发器更新表
【发布时间】:2017-01-11 07:59:30
【问题描述】:

我有一个数据库,存储一些关于电视剧的信息。

此数据库有一个名为 Stagione 的表,其列 Anno (YEAR)。

我需要为Stagione的每一行声明一个变量differenza来存储AnnoYEAR(GETDATE())之间的差异,如果differenza的值是

UPDATE Stagione.Prezzo = Stagione.Prezzo * 0.9

我不知道如何结合触发器和过程来实现这一点,这可能吗?

我在 phpmyadmin 10.1.13-MariaDB 上工作

编辑,现在工作:

DELIMITER |
CREATE PROCEDURE Promoz (IN an YEAR)
BEGIN
DECLARE differenza YEAR;
UPDATE stagione
SET Prezzo = prezzo*0.9
WHERE (an-Anno > 0) AND (an-Anno < 10);
UPDATE stagione
SET Prezzo = 0
WHERE (an-Anno > 10);
END |
DELIMITER ;

【问题讨论】:

  • 请显示您的表格结构。也许你可以给出你对StagioneCREATE TABLE 声明。

标签: mysql triggers mariadb procedure


【解决方案1】:

如果您现在更新记录,您将获得想要的结果,但只是现在。因为如果你三年后查询相同的数据,你仍然会找到 Prezzo 乘以 0.9 的记录,但同时有一个 10 多年前的 Anno

相反,您应该让数据保持原样,并使用在查询时进行计算的数据库视图。像这样的:

CREATE OR REPLACE VIEW Stagione_view AS
SELECT Anno, 
       YEAR(GETDATE()) - Anno AS differenza,
       (CASE WHEN YEAR(GETDATE()) - Anno < 10 
            THEN 0.9 ELSE 1 
       END) * Prezzo AS Prezzo
FROM   Stagione

现在,只要确保您始终查询 Stagione_view 而不是 Stagione,您就会获得想要的效果。

代码说明

CREATE OR REPLACE VIEW:这会在您的数据库中创建一个新对象:视图。就像表格一样,它有行和列。不同之处在于它的数据是使用SELECT 语句从其他表中动态检索的。因此,当您查询视图时,数据库实际上会在后台执行 SELECT 语句。

YEAR(GETDATE()) - Anno AS differenza:这是年差的计算。因为它是在视图中完成的,所以使用GETDATE() 的当前值始终是准确的。

然后是魔法部分:

CASE WHEN YEAR(GETDATE()) - Anno < 10 
     THEN 0.9 ELSE 1 
END

这将检查年份差异是否小于 10。如果是,则取 0.9 的值,否则取 1 的值。然后在更大的表达式中使用此结果:

       (CASE WHEN YEAR(GETDATE()) - Anno < 10 
            THEN 0.9 ELSE 1 
       END) * Prezzo AS Prezzo

... 0.9 或 1 乘以 Prezzo。当然,如果第一个值是 1,那么这只会导致与 Prezzo 已有的值相同,但否则你正在做 0.9 * Prezzo。不管它是什么,它在视图中被命名为Prezzo。所以当你查询视图时你会看到调整后的Prezzo值:

SELECT * FROM Stagione_view;

改写问题后

每年的第一天,检查Stagione.Anno与当年的差值,如果差值小于10且大于0更新Prezzo=Prezzo*0.9否则设置Prezzo = 0

在这种情况下,请在一年的第一天发出以下update 声明:

UPDATE Stagiane
SET    Prezzo = CASE WHEN YEAR(GETDATE()) - Anno < 10 
            THEN 0.9 ELSE 0 
       END) * Prezzo
WHERE  YEAR(GETDATE()) > Anno

您可以使用CREATE EVENT statement 安排执行此语句。

例如:

CREATE EVENT adjust_prezzo
ON SCHEDULE EVERY 1 YEAR
STARTS '2017-01-01 08:00'
DO 
    UPDATE Stagiane
    SET    Prezzo = CASE WHEN YEAR(GETDATE()) - Anno < 10 
                THEN 0.9 ELSE 0 
           END) * Prezzo
    WHERE  YEAR(GETDATE()) > Anno;

【讨论】:

  • 我明白你的意思,你是对的,但我不明白你的代码是做什么的。我是初学者,但我真的很想学,你能解释一下吗?谢谢
  • 我现在看到了,我要试试
  • 抱歉,我的英语不好造成了问题。可能我解释得不好。我想要做的是,每年的第一天,检查 Stagione.Anno 和当前年份之间的差异,如果这个差异小于 10 并且大于 0 更新 Prezzo=Prezzo*0.9 否则设置 Prezzo = 0.
  • 我根据此评论更新了答案。我想你不想改变Anno = YEAR(GETDATE())时的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多