我在創建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