2014-10-11 105 views
1

我在创建MySQL触发器时​​遇到了问题。触发器使用替换,所以当一行被替换时,它读取行并将信息保存在另一个表中。如果将新行插入到跟踪表中,则该信息不会保存在另一个表中,因为该行尚不存在。我只需要保存跟踪行,如果它已经存在。mysql触发器语法错误

DROP TRIGGER IF EXISTS savetracking; 

CREATE TRIGGER savetracking BEFORE REPLACE ON 'orderstest.tracking' 
FOR EACH ROW 
BEGIN 
DECLARE orderid INTEGER; 

IF NEW.invno != '' THEN 
SET orderid = (SELECT orderid FROM order_header WHERE invno = NEW.invno); 
INSERT INTO comments (id, date_time, type, comments) VALUES 
      (orderid, SYSDATE(), \"O\", \"Previous Tracking: USPS - OLD.trackno\"); 
ENDIF; 
END; 

这是错误我得到:

#1064 - 你在你的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的“替换‘orderstest.tracking正确的语法在1号线

我使用phpMyAdmin来’ FOR EACH ROW BEGIN DECLARE订单ID INTEGER”手册尝试并添加触发器。

MySQL的版本软件版本:5.0.95-RS

感谢,

史蒂夫

--- 
- Table structure for table `tracking` 
-- 

CREATE TABLE IF NOT EXISTS `tracking` (
    `id` int(11) NOT NULL auto_increment, 
    `invno` bigint(20) NOT NULL default '0', 
    `carrier` varchar(5) NOT NULL default '', 
    `trackno` varchar(50) NOT NULL default '', 
    PRIMARY KEY (`id`), 
    KEY `invno` (`invno`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3033 ; 

-- 
-- Table structure for table `comments` 
-- 

CREATE TABLE IF NOT EXISTS `comments` (
    `comment_id` int(11) NOT NULL auto_increment, 
    `id` int(11) NOT NULL default '0', 
    `date_time` datetime NOT NULL default '0000-00-00 00:00:00', 
    `type` char(1) NOT NULL default '', 
    `comments` mediumtext NOT NULL, 
    PRIMARY KEY (`comment_id`), 
    KEY `id` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10426 ; 

-- 
-- Table structure for table `order_header` 
-- 

CREATE TABLE IF NOT EXISTS `order_header` (
    `our_orderid` int(11) NOT NULL auto_increment, 
    `orderid` varchar(20) NOT NULL default '0', 
    `orderdatetime` datetime NOT NULL default '0000-00-00 00:00:00', 
    `custid` int(11) NOT NULL default '0', 
    `source` char(1) NOT NULL default '', 
    `comments` mediumtext NOT NULL, 
    `invno` bigint(20) NOT NULL default '0', 
    `infoid` varchar(15) NOT NULL default '0', 
    `remote_host` varchar(50) NOT NULL default '', 
    `remote_addr` varchar(50) NOT NULL default '', 
    `items` int(11) NOT NULL default '0', 
    `paytype` varchar(20) NOT NULL default '', 
    `cc_name` varchar(50) NOT NULL default '', 
    `cc_num` tinyblob NOT NULL, 
    `cc_valid` tinyblob NOT NULL, 
    `cc_expire` varchar(10) NOT NULL default '', 
    `avs_address` varchar(20) NOT NULL default '', 
    `avs_zip` varchar(5) NOT NULL default '', 
    `shipping` varchar(30) NOT NULL default '', 
    `order_status` char(1) NOT NULL default '', 
    `batch_no` int(11) NOT NULL default '0', 
    `time_process` datetime NOT NULL default '0000-00-00 00:00:00', 
    `fraud_flag` char(1) NOT NULL default '', 
    `referrer` varchar(255) NOT NULL default '', 
    `stats` char(1) NOT NULL default 'N', 
    `country_code` char(2) NOT NULL default '', 
    `zipzone` tinyint(4) NOT NULL default '0', 
    `ship_zip` varchar(5) NOT NULL default '', 
    `bank_name` varchar(50) NOT NULL default '', 
    `bank_country_name` varchar(50) NOT NULL default '', 
    PRIMARY KEY (`our_orderid`), 
    KEY `order_status` (`order_status`), 
    KEY `orderdatetime` (`orderdatetime`), 
    KEY `invno` (`invno`), 
    KEY `remote_host` (`remote_host`), 
    KEY `custid` (`custid`), 
    KEY `infoid` (`infoid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=320081 ; 

我已经改变了触发了这一点。

DROP TRIGGER IF EXISTS savetracking; 

CREATE TRIGGER savetracking BEFORE INSERT ON orderstest.tracking 
FOR EACH ROW 
BEGIN 
DECLARE orderid INTEGER; 
DECLARE otrackno INTEGER; 

SET otrackno = (SELECT trackno FROM tracking WHERE invno = NEW.invno); 
IF otrackno != '' THEN 
SET orderid = (SELECT orderid FROM order_header WHERE invno = NEW.invno); 
INSERT INTO comments (id, date_time, type, comments) VALUES 
      (orderid, SYSDATE(), 'O', 'Previous Tracking: USPS - otrackno'); 
DELETE FROM trackno WHERE invno = NEW.invno; 

ENDIF; 

END;

我现在得到的错误是

1064 - 你在你的SQL语法错误;请检查与您的MySQL服务器版本对应的手册,以便在第4行使用正确的语法

+0

请显示您的表架构(至少相关部分) – peterm 2014-10-11 17:19:01

+0

这是一个语法错误,所以表结构实际上并不真正相关。 ;-) – GolezTrol 2014-10-11 22:07:09

+0

这可能是由于'IF NEW.invno!=''THEN'这行中的魔术引号引起的。你是否输入了这个或从文字处理器复制这个?使用普通引号:''''。 – GolezTrol 2014-10-11 22:08:08

回答

0

没有REPLACE触发器。您可以选择INSERT,UPDATEDELETE

如果您执行REPLACE,则会导致表上的DELETEINSERT触发器运行。

此外,你不能像你正在做的那样引用表名。

ON 'orderstest.tracking' 

应该

ON `orderstest`.`tracking` 

,并尝试定义包含复合语句的触发器之前,你应该了解how to use DELIMITER

+0

如果您阅读了这个问题,您会看到我使用的是PHPMyAdmin,因此不需要指定分隔符。我曾尝试使用INSERT代替REPLACE,并且错误仍然发生在相同的地方。 – 2014-10-12 04:04:47

0

我想向Bill大量道歉。他是对的。即使我使用PHPMyAdmin,我也需要使用分隔符。他也是正确的,我不能在触发器中使用替换。我现在通过使用插入触发器和更改触发器内的逻辑来解决问题。谢谢比尔。

+0

谢谢,我很乐意提供帮助。顺便说一下,StackOverflow习惯上给出了帮助你的答案,然后点击答案中的“接受答案”复选标记,结果是正确的。 – 2014-10-13 17:04:36