导入先前导出的mysql触发器时出错

时间:2015-08-28 21:48:18

标签: mysql triggers

我有一个mysql触发器一直在工作,我导出它并删除它并试图把它放回去,但我一直遇到以下错误:

#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 '' at line 12

我的触发器是:

    CREATE TRIGGER `accounts_tracking` AFTER UPDATE ON `accounts`
 FOR EACH ROW BEGIN
IF( NEW.`check_level` != OLD.`check_level` ) THEN
INSERT INTO `accounts_tracking` ( `change_type`, `account_id`, `field`, `old_int`, `new_int`, `old_time`, `new_time` )
VALUES
( "1", 
 OLD.id, 
 "check_level",
 OLD.`check_level`, 
 NEW.`check_level`, 
 UNIX_TIMESTAMP(), 
 UNIX_TIMESTAMP());
END IF;
END

第12行是第二个UNIX_TIMESTAMP()

我的表格结构如下:

CREATE TABLE `accounts_tracking` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `change_type` smallint(5) unsigned NOT NULL,
  `account_id` int(10) unsigned NOT NULL,
  `field` varchar(255) NOT NULL,
  `old_int` int(11) NOT NULL,
  `new_int` int(11) NOT NULL,
  `new_time` int(10) unsigned NOT NULL,
  `old_time` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `account_id` (`account_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

服务器类型:MySQL 服务器版本:5.1.73-log

感谢。

1 个答案:

答案 0 :(得分:3)

正如barranka在评论部分中建议的那样,您需要将此触发器包含在分隔符中,如下所示:

DELIMITER $$
    CREATE TRIGGER `accounts_tracking` AFTER UPDATE ON `accounts`
 FOR EACH ROW BEGIN
IF( NEW.`check_level` != OLD.`check_level`) THEN
INSERT INTO `accounts_tracking` ( `change_type`, `account_id`, `field`, `old_int`, `new_int`, `old_time`, `new_time` )
VALUES
( "1", 
 OLD.id, 
 "check_level",
 OLD.`check_level`, 
 NEW.`check_level`, 
 UNIX_TIMESTAMP(), 
 UNIX_TIMESTAMP());
END IF;
END$$
DELIMITER ;

原因是通过在语句中添加Begin and End,您实际上是使用触发器本身创建stored routine/procedure。为了运行多个语句,比如在存储的例程/过程中,您需要添加分隔符。

在触发器中没有Begin和End的其他情况下,您不需要分隔符。例如:

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;