2011-01-25 118 views
0

我想创建一个触发器。首先,我创建表的员工和表employees_audit:错误在MySQL触发器

CREATE TABLE employees (
    employeeNumber int(11) NOT NULL, 
    lastName varchar(50) NOT NULL, 
    firstName varchar(50) NOT NULL, 
    extension varchar(10) NOT NULL, 
    email varchar(100) NOT NULL, 
    officeCode varchar(10) NOT NULL, 
    reportsTo int(11) default NULL, 
    jobTitle varchar(50) NOT NULL, 
    PRIMARY KEY (employeeNumber) 
) 

CREATE TABLE employees_audit ( 
id int(11) NOT NULL AUTO_INCREMENT, 
employeeNumber int(11) NOT NULL, 
lastname varchar(50) NOT NULL, 
changedon datetime DEFAULT NULL, 
action varchar(50) DEFAULT NULL, 
PRIMARY KEY (id) 
) 

然后我创建触发器:

DELIMITER $$ 
CREATE TRIGGER before_employee_update 
BEFORE UPDATE ON employees 
FOR EACH ROW BEGIN 
INSERT INTO employees_audit 
SET action = 'update', 
employeeNumber = OLD.employeeNumber, 
lastname = OLD.lastname, 
changedon = NOW(); END$$ 
DELIMITER ; 

两个第一台和第二个是创建,但是当我执行触发器 我得到一个错误

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $$ 
CREATE TRIGGER before_employee_update 
BEFORE UPDATE ON employe' at line 1 

在我的代码中是否有任何错误,或者我是否需要另一个MySQL版本?

+0

我已更新我的答案。看起来你忽略了一些微不足道的东西。 – Nishant 2011-01-25 16:25:50

回答

0

你是从phpMyAdmin运行这个吗?如果是这样,分隔符应该设置在SQL textarea下方的字段中,而不是在文本区域中。

而且没有。与已被删除的答案相反,在DELIMITER $$之后不需要;,因为那会将分隔符设置为$$;

0

好吧,我已经知道你在做错了什么。请参见下面的执行:

mysql> CREATE TABLE employees_audit (
-> id int(11) NOT NULL AUTO_INCREMENT, 
-> employeeNumber int(11) NOT NULL, 
-> lastname varchar(50) NOT NULL, 
-> changedon datetime DEFAULT NULL, 
-> action varchar(50) DEFAULT NULL, 
-> PRIMARY KEY (id) 
-> ) 
-> 
-> DELIMITER $$ 
-> CREATE TRIGGER before_employee_update 
-> BEFORE UPDATE ON employees 
-> FOR EACH ROW BEGIN 
-> INSERT INTO employees_audit 
-> SET action = 'update', 
-> employeeNumber = OLD.employeeNumber, 
-> lastname = OLD.lastname, 
-> changedon = NOW(); END$$ 

ERROR 1064(42000):你在你的SQL语法错误;检查手册中 对应于你的MySQL服务器版本使用附近的“DELIM ITER $$

摇铃正确的语法?看起来像吗?

老弟,你有(最有可能)忘了把;年底创建表指令。下面的代码工作:

mysql> 
    mysql> CREATE TABLE employees_audit (
     -> id int(11) NOT NULL AUTO_INCREMENT, 
     -> employeeNumber int(11) NOT NULL, 
     -> lastname varchar(50) NOT NULL, 
     -> changedon datetime DEFAULT NULL, 
     -> action varchar(50) DEFAULT NULL, 
     -> PRIMARY KEY (id) 
     -> ); 
    Query OK, 0 rows affected (0.09 sec) 

    mysql> 
    mysql> DELIMITER $$ 
    mysql> CREATE TRIGGER before_employee_update 
     -> BEFORE UPDATE ON employees 
     -> FOR EACH ROW BEGIN 
     -> INSERT INTO employees_audit 
     -> SET action = 'update', 
     -> employeeNumber = OLD.employeeNumber, 
     -> lastname = OLD.lastname, 
     -> changedon = NOW(); END$$ 
    Query OK, 0 rows affected (0.01 sec) 

    mysql> DELIMITER ; 

OLD ANSWER

试试这个

DELIMITER $$ 
CREATE TRIGGER before_employee_update BEFORE UPDATE ON employees 
FOR EACH ROW 
BEGIN 
    INSERT INTO employees_audit 
    SET action = 'update', 
    employeeNumber = OLD.employeeNumber, 
    lastname = OLD.lastname, 
    changedon = NOW(); 
END;$$ 
DELIMITER ; 

失踪 ; END后,我想,

编辑:固定foramtting

EDIT1:再回答。

+0

不,不应该有`;`那里。 – Mchl 2011-01-25 09:04:06