mysql触发语法错误

史蒂夫·巴恩斯

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

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服务器版本对应的手册以获取正确的语法,以在第1行的'REPLACE ON'orderstest.tracking'FOR EACH ROW BEGIN DECLARE orderid INTEGER'附近使用

我正在使用PHPMyAdmin尝试添加触发器。

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;

结尾;

我现在得到的错误是

1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取在第4行的''附近使用的正确语法

比尔·卡温

没有REPLACE触发器。你的选择INSERTUPDATEDELETE

如果执行REPLACE,它将导致表上的DELETEINSERT触发器同时运行。

另外,您不能像执行操作一样引用表名。

ON 'orderstest.tracking'

应该

ON `orderstest`.`tracking`

在尝试定义包含复合语句的触发器之前,您应该了解如何使用DELIMITER

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章