我有一个表在我的数据库称为股票价格历史,它跟踪价格变化的股票项目,并包含以下feilds:
Datestart默认为CURRENT_TIMESTAMP,Dateend默认为无,就像没有Dateend值一样,那么该行中的价格就是该股票的当前价格。
现在,我如何(我认为这是通过触发器)使它在我为特定股票项目插入新行时,更新该股票项目的最后一行(即与该股票项目匹配的行,其中DateEnd设置为NULL),以匹配刚刚为插入新行提供的DateStart值,如下所示:
这是表格的初始状态:
然后,当为该库存项目(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只有一行没有结束日期,这将是当前价格的一行。
我认为这将通过插入前触发器完成,但我很可能错了。
根据文件:
在存储的函数或触发器中,不允许修改调用该函数或触发器的语句已在使用(用于读取或写入)的表。
在插入后,您始终可以从插入位置进行更新。
要更新它,你可以做:
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)的行。
希望有帮助。
正如@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的最佳方法吗? 如何正确存储最后插入的注释行中的数据,以便在