我在创建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;
我现在得到的错误是
请显示您的表架构(至少相关部分) – peterm 2014-10-11 17:19:01
这是一个语法错误,所以表结构实际上并不真正相关。 ;-) – GolezTrol 2014-10-11 22:07:09
这可能是由于'IF NEW.invno!=''THEN'这行中的魔术引号引起的。你是否输入了这个或从文字处理器复制这个?使用普通引号:''''。 – GolezTrol 2014-10-11 22:08:08