我有两张桌子。第一个是我的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
它给了我语法错误......也没有很多触发器引用,一点推动会非常感激!
答案 0 :(得分:2)
看一下以下示例
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
关键字。