【问题标题】:SQL Trigger to Update a Record instead of Inserting if values havent changed如果值没有改变,SQL 触发器更新记录而不是插入
【发布时间】:2019-02-03 22:22:50
【问题描述】:

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

示例表

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

这个表没有主键,因为它会有多个相同 ID 的记录,每个记录都有不同的日期。如果收入发生变化,我想节省一些空间是更新而不是插入......例如,如果下一条记录将是:

11  John  15000  2019-02-03

我希望触发器更新 DATE 而不是在表上创建新记录。所以它最终会像:

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】:

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

    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;
    

    【讨论】:

    • 不太确定是否可以从触发器修改触发器附加到的表。
    • 谢谢,但是当我执行插入时它崩溃了,我认为它就像@Shadow 所说的那样......
    • 无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器 @EmreSERBEST 的语句使用
    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多