gpt4 book ai didi

mysql - 如果值未更改,则 SQL 触发器更新记录而不是插入

转载 作者:行者123 更新时间:2023-11-29 16:21:04 25 4
gpt4 key购买 nike

我正在尝试实现一个 SQL 触发器,如果​​一列的值没有更改,它将更新而不是插入。

示例表

Id | Name | Income | Date
11 John 10000 2019-02-01
11 John 15000 2019-02-02

该表没有主键,因为同一 ID 将有多个记录,每条记录都有不同的日期。我想要节省一些空间的是如果收入已更改,则更新而不是插入...例如,如果下一条记录将是:

11  John  15000  2019-02-03

我希望触发器更新日期而不是在表上创建新记录。所以最终会是这样的:

11   John   10000    2019-02-01
11 John 15000 2019-02-03 <-- Changed!

数据来自记录当天收入的每小时表...并且在一天结束时将每小时表上的所有记录大量插入到收入表中以保留历史记录。

我尝试了以下触发器,但它不起作用,因为它会锁定。

DELIMITER //
CREATE TRIGGER before_insert_income
BEFORE INSERT ON income_30
FOR EACH ROW
BEGIN
IF NEW.income = (select income from income_30 where ID=NEW.ID and date=(select max(date) from income_30)) THEN
UPDATE income_30 set date = NEW.date where ID=NEW.ID;
END IF;
END; //
DELIMITER ;

我还考虑过执行更新而不是插入,并执行一个触发器来执行相反的操作,如果收入发生变化,将插入一条新记录,但我不知道可以将哪一列作为更新的主要列。

如果这是一个愚蠢的问题,我深表歉意,但它困扰了我一段时间。

非常感谢!

最佳答案

如果您只关心节省空间,我认为您应该只删除上个月具有相同收入记录的内容,然后再尝试插入具有相同金额的新收入。

DELIMITER //
CREATE TRIGGER before_insert_income
BEFORE INSERT ON income_30
FOR EACH ROW
BEGIN
IF NEW.income = (select income from income_30 where ID=NEW.ID and date=(select max(date) from income_30)) THEN
DELETE FROM income_30 where id=NEW.id and date=(select max(date) from income_30);

END IF;
END; //
DELIMITER;

关于mysql - 如果值未更改,则 SQL 触发器更新记录而不是插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54508186/

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