2014-10-11 130 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