MySQL触发器更新复制整行

6

我正在尝试创建一个触发器,在任何UPDATE操作时将整个行复制到审核表中。

我有两个表:

FrequenciesFrequencies_Audit

以下是我的触发器:

create trigger auditlog 
before update on frequencies
for each row insert into
frequencies_audit select frequencies.*;

当我更新记录时,出现了未知表frequencies的错误。
如果可能的话,我不想每次都单独输入每个字段名称,因为我们经常在数据库中添加列。
2个回答

18

可以使用以下方式编写 AFTER UPDATE 触发器,而不是 BEFORE UPDATE

DELIMITER //
CREATE TRIGGER auditlog AFTER UPDATE ON frequencies
FOR EACH ROW BEGIN  
    INSERT INTO frequencies_audit select * from frequencies where freqId = NEW.freqId;
END;//
DELIMITER ;

freqId只是ID列的一个名称。请将其替换为您频率表中的ID列名称。


请注意,如果您在触发器上使用“BEGIN ... END”语法,则必须覆盖分隔符。 - Clay

0
你可以试试这个。
create trigger auditlog 
AFTER UPDATE on frequencies
for each row insert into
frequencies_audit select * from frequencies;

因为在MYSQL中,如果你写了select TableName.*,那么它总是会返回一个错误Unknown table TableName

也许这能帮到你。


我得到了“字段列表中的未知列'频率'”这个错误。 - JeffD
不可能,如果两个表结构相同,则无法发生。请检查表结构。 - Ajay Kadyan
表结构是相同的。我复制了没有记录的表。 - JeffD
我创建了这个触发器,它运行良好。DROP TRIGGER IF EXISTS auditlog// CREATE TRIGGER auditlog BEFORE UPDATE ON questions FOR EACH ROW insert into questions_old select * from questions // - Ajay Kadyan
只需将您的表名替换为我的示例代码中的表名,然后执行即可。 - Ajay Kadyan
似乎这个方法可以工作,但是它复制的是整个数据库而不仅仅是我正在处理的行。我想我需要加上一个WHERE语句?更具体地说,我只想复制正在更新的那一行。 - JeffD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接