Sql 如何为更新后的表创建一个获取主键,我们将在该表上创建一个触发器?

Sql 如何为更新后的表创建一个获取主键,我们将在该表上创建一个触发器?,sql,triggers,database-trigger,Sql,Triggers,Database Trigger,我有一个Product表和一个ProductPriceLog表来维护产品的价格。 假设产品表有3个字段[ProductId,ProductName,ProductPrice],而价格历史记录只有2个字段[ProductId(fk),ProductPrice] 我正在尝试编写一个触发器,它将在每次更新产品价格时添加一个日志条目 CREATE TRIGGER price_change_trg ON PRODUCT AFTER INSERT OR UPDATE OF ProductPrice ON P

我有一个Product表和一个ProductPriceLog表来维护产品的价格。 假设产品表有3个字段
[ProductId,ProductName,ProductPrice]
,而价格历史记录只有2个字段
[ProductId(fk),ProductPrice]

我正在尝试编写一个触发器,它将在每次更新产品价格时添加一个日志条目

CREATE TRIGGER price_change_trg
ON PRODUCT
AFTER INSERT OR UPDATE OF ProductPrice ON PRODUCT
BEGIN

     INSERT INTO ProductPriceLog ( @idd , ProductPrice)
END;

具体来说,如何从更新后的Product表的行中获取productId

如果我理解您的问题,您必须使用插入的表,该表包含刚刚插入到产品表中的数据
从插入的
中选择@idd=productid

您可以参考我的解决方案。希望能帮上忙,我的朋友

CREATE TRIGGER price_change_trg
ON PRODUCT
AFTER INSERT, UPDATE
AS
BEGIN
declare @productId int;
declare @ProductPrice decimal(10,2);
select @productId = i.ProductId from inserted i;
select @ProductPrice = i.ProductPrice from inserted i;  
     INSERT INTO ProductPriceLog VALUES ( @productId  , @ProductPrice )
END;

触发器是高度特定于供应商的-因此请添加一个标记来指定您使用的是
mysql
postgresql
sql server
oracle
db2
,还是其他完全不同的东西。您的触发器有一个主要缺陷,您似乎认为它每行调用一次-事实并非如此。每个语句触发一次触发器,所以如果语句影响25行,您将触发一次触发器,但随后插入的伪表将包含25行。您的代码将在此处选择这25行中的哪一行<代码>从插入的i中选择@productId=i.productId-这是不确定的,您将得到一个任意行,并将忽略所有其他行。你需要重写你的触发器来考虑这一点!为什么我在Microsoft SQL server management studio中尝试此操作,为什么在以下
插入到ProductPriceLog(@productId,@ProductPrice)
ProductPriceLog之前已经创建过,所以我不确定为什么会出现此错误。@JavaDeveloper:对不起,我的朋友。我错过了ProductPriceLog表前面的Values关键字。