在更新时创建触发器以将旧值插入到MYSQL中的另一个表中

时间:2013-12-24 03:57:43

标签: mysql sql triggers sql-update sql-insert

我有两张桌子。第一个是我的person表,它有id,name,creation_date作为值,我有一个old_person表(id,name,modified_date),我想在实际更改之前填充person的值。我该怎么办呢?我尝试过触发但失败了。

我尝试如下

create trigger Person_Trigger Update on person
before update
as
insert into old_person(id, name, modified) 
select id, new.name, getdate()
from person

它给了我语法错误......也没有很多触发器引用,一点推动会非常感激!

2 个答案:

答案 0 :(得分:2)

看一下以下示例

SQL Fiddle DEMO

IO自己有点麻烦,但是How to Create Triggers in MySQL有一条线让我思考

  

我们将发布的第一个MySQL命令有点不寻常:

     

DELIMITER $$

     

我们的触发器主体需要以a分隔的许多SQL命令   分号(;)。要创建完整的触发器代码,我们必须改变   分隔其他东西 - 例如$$。

     

最后,我们将分隔符设置为分号:

     

DELIMITER;

所以在SQL Fiddle中我将查询终结符更改为GO,这似乎是最重要的工作。

CREATE TABLE person
(
  id INT,
  name varchar(20)
)
GO
CREATE TABLE old_person
(
  id INT,
  name varchar(20),
  modified DATETIME
)
GO
CREATE TRIGGER Person_Trigger before update on person
FOR EACH ROW BEGIN
  INSERT INTO old_person(id, name, modified) 
  VALUES (OLD.id, OLD.name, NOW());
END
GO



INSERT INTO person VALUES (1,'TADA')
GO

UPDATE person SET name = 'FOO'
GO

答案 1 :(得分:1)

试试这个:

DELIMITER \\
CREATE TRIGGER `Person_Trigger`
BEFORE UPDATE ON `Person`
FOR EACH ROW
BEGIN
DECLARE date_modified datetime;

SET date_modified = NOW();

INSERT INTO old_person(id, name, modified) 
VALUES (OLD.id, OLD.name, date_modified);
END\\

这个语法适用于我自己的项目。在开始触发之前,您可能还需要声明分隔符。此外,如果您想使用NEW关键字,则应AFTER更新。如果您要在触发器上继续使用OLD更新,请切换到BEFORE关键字。