当前位置: 首页 > 知识库问答 >
问题:

在提交插入之前,如何编写更新同一表中的行的触发器?

齐泰
2023-03-14

我有一个表在我的数据库称为股票价格历史,它跟踪价格变化的股票项目,并包含以下feilds:

  • 股票ID

Datestart默认为CURRENT_TIMESTAMP,Dateend默认为无,就像没有Dateend值一样,那么该行中的价格就是该股票的当前价格。

现在,我如何(我认为这是通过触发器)使它在我为特定股票项目插入新行时,更新该股票项目的最后一行(即与该股票项目匹配的行,其中DateEnd设置为NULL),以匹配刚刚为插入新行提供的DateStart值,如下所示:

这是表格的初始状态:

  1. 1,2.99,2013-11-19 18:49:24,NULL

然后,当为该库存项目(ID 1)插入新行时,结果如下:

>

  • 1,4.992013-11-20 12:00:00,空

    1,2.99,2013-11-19 18:49:24,2013-11-20 12:00:00

    理论上,它只需要更新一行,因为每个股票ID只有一行没有结束日期,这将是当前价格的一行。

    我认为这将通过插入前触发器完成,但我很可能错了。

  • 共有2个答案

    终波涛
    2023-03-14

    根据文件:

    在存储的函数或触发器中,不允许修改调用该函数或触发器的语句已在使用(用于读取或写入)的表。

    在插入后,您始终可以从插入位置进行更新。

    要更新它,你可以做:

    UPDATE stockpricehistory s
    INNER JOIN (
      SELECT stockID,
        MAX(dateStart) AS maxDate
      FROM stockpricehistory
      WHERE StockID = 1
        AND DateEnd IS NULL
      ) a ON s.StockID = a.StockID    
    SET s.dateEnd = a.maxDate
    WHERE s.DateEnd IS NULL
      AND s.dateStart != a.maxDate
    

    这是为了让您更新其中一个dateEnd为NULL的行,而不是最大值(dateStart)的行。

    希望有帮助。

    范鸿
    2023-03-14

    正如@Filipe Silva所说,您不能修改在该表上调用的触发器中的表。

    你可以通过为股票和股票价格历史设置单独的表格来解决这个问题,这在任何情况下都可能是一个好主意。stock表为每个库存项目保存一行及其当前价格,当插入或更新stock中的行时,该表上的触发器将维护stockpricehistory中的记录。

    http://sqlfiddle.com/#!2/55c626/1

    create table stock (
      stockId int primary key,
      price numeric(5, 2));
    
    create table stockpricehistory (
      stockId int,
      price numeric(5,2),
      dateStart datetime,
      dateEnd datetime);
    
    create trigger t_si before insert on stock
    for each row
      insert into stockpricehistory values (new.stockId, new.price, current_timestamp, null);
    
    create trigger t_su before update on stock
    for each row begin
      update 
        stockpricehistory 
      set
        dateEnd = current_timestamp
      where
        stockId = new.stockId and
        dateEnd is null;
      insert into stockpricehistory values (new.stockId, new.price, current_timestamp, null);
    end;
    
     类似资料:
    • 问题内容: 这是我想做的事情: 当表中有新记录时,我需要通过设置以表示特定(旧)帐户已被编辑来更新where =中的行。 要求 不是 我要操纵 新插入的 列,而是要使用一个 已经存在的 列 但是,我无法更新同一张表: 请提出解决方法 PS:我已经走过了更新表触发器在同一个表更新后,插入到相同的表触发的mysql,更新与后同桌INSERT触发器和表后插入MySQL的触发器与插入和更新,但他们似乎没有

    • 以下是我想做的: 当表中有新的 时,我需要通过设置 ' 来更新中的行 = ,以表示特定(旧)帐户已被编辑。 要求不是操作新插入的列,而是使用< code>pk = NEW.edit_on操作已经存在的列 但是,我无法更新同一个表: 请建议一个解决方法 PS:我已经完成了更新同一表后在触发器中更新表、插入到同一表中触发器mysql、在同一表上用插入后触发器更新以及在表上用Insert和update在

    • 问题内容: 我要在tableA上写一个插入触发器。它将使用相同的表但不同的列执行更新。执行此操作时出现错误。我的触发器是 我有一个应用程序将单独执行col2并将col1保持为空。因此,一旦插入行,我的触发器将为col1提供值。但是插入行时出现错误消息,提示“触发器失败且无效”。这该怎么做。TIA。 问题答案: 如果要分配一个简单的默认值,最简单的方法是使用DEFAULT子句在表上声明它。 这适用于

    • 问题内容: 我希望该列始终为/ 。我正在使用AFTER UPDATE触发器来完成此操作。因此,如果要向该表中添加100次点击,我希望EPC自动更新。 我正在尝试: 并得到此错误: 我也尝试使用OLD,但也出现了错误。我可以在此之前做,但是如果我添加了100次点击,它将使用之前的#次点击作为触发条件(对吗?) 我应该怎么做才能做到这一点? 编辑-将在此运行查询的示例: 问题答案: 您无法 在 更新

    • 问题内容: 在同一张表上更新后,如何在触发器中更新表的列? 这是触发条件: 现在当我像这样更新表时 这不起作用,因为我得到以下信息: 那么我到底该如何工作呢? 问题答案: 如果将触发器更改为而不是,可以这样操作:

    • 问题内容: 我正在寻找在表上创建MySQL触发器。本质上,我正在创建活动流,并且需要记录用户的操作。当用户发表评论时,我希望该表上的数据库触发器触发并: 抓住最后插入的行的ID(注释行的ID)。 使用最后插入的行中的数据对活动表执行INSERT。 实际上,我将复制此触发器以删除评论。 我的问题: LAST_INSERT_ID()是获取ID的最佳方法吗? 如何正确存储最后插入的注释行中的数据,以便在