如果值没有改变SQL触发器更新的记录,而不是插入

问题描述 投票:0回答:1

我试着去执行一个SQL触发器,将更新而不是插入,如果一列hasent变化值..

实施例表

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

此表没有主键,因为这将有多个记录相同的ID,每一个有diferent日期。我想才达到节省一些空间,如果收入hasent变化......例如,如果下一个记录是要及时更新,而不是INSERT:

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 ;

我也不过这样做的UPDATE而不是INSERT和执行触发器会做相反的,如果将收入变插入一个新的记录,但我不知道这列可我主要做了更新。

我道歉,如果这是一个愚蠢的问题,但其正困扰我一段时间。

非常感谢!

mysql sql triggers insert
1个回答
0
投票

如果你只关心节约空间,我认为你应该只在上个月删除与收入相同的记录您尝试插入新的收入,同量之前。

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;
© www.soinside.com 2019 - 2024. All rights reserved.