2014-10-11 5 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 구문에 오류가 있습니다; 라인 I가 phpMyAdmin을 사용하고 1

을에서 ' DECLARE의 OrderID를 정수를 BEGIN EACH ROW 위한 'orderstest.tracking 'ON 교체'근처 사용할 수있는 권리 구문에 대한 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 ; 

나는이에 트리거를 변경 :

MySQL 버전은 소프트웨어 버전입니다.

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 서버 버전에 해당하는 설명서를 확인하여 올바른 구문을 찾아서 'at line 4'근처에서 사용하십시오.

+0

테이블 스키마 (적어도 관련 부분)를 표시하십시오. – peterm

+0

이것은 구문 오류이므로 테이블 구조가 실제로 적절하지 않습니다. ;-) – GolezTrol

+0

아마'IF NEW.invno! = ''THEN' 라인의 마법 따옴표 때문일 것입니다. 이것을 워드 프로세서에서 입력했거나 복사 했습니까? 보통 따옴표를 사용하십시오 :' '''. – GolezTrol

답변

0

REPLACE 트리거가 없습니다. INSERT, UPDATE 또는 DELETE 중에서 선택할 수 있습니다.

REPLACE을 실행하면 테이블의 DELETEINSERT 트리거가 실행됩니다.

또한 테이블 이름을 인용 할 수 없습니다.

ON 'orderstest.tracking' 

ON `orderstest`.`tracking` 

해야하며,이 화합물 문을 포함하는 트리거를 정의하기 전에 당신에 대한 how to use DELIMITER을 배워야한다.

+0

질문을 읽으면 PHPMyAdmin을 사용하고있는 것을 볼 수 있으므로 구분 기호를 지정할 필요가 없습니다. REPLACE 대신 INSERT를 사용하려고 시도했지만 오류가 여전히 같은 위치에서 발생합니다. –

0

빌에게 진심으로 사과하고 싶습니다. 그는 옳았다. 나는 PHPMyAdmin을 사용하고 있었지만 구분 기호를 사용해야했습니다. 그는 또한 방아쇠를 당겨서 교체 할 수 없다는 점에서 정확했습니다. 이제 트리거 삽입을 사용하고 트리거 내에서 논리를 변경하여 문제를 해결했습니다. 감사 빌.

+0

감사합니다. 기꺼이 도와 드리겠습니다. 그건 그렇고, 그것은 StackOverflow에서 당신에게 도움이 답변에 upvote을 제공하고 올바른 것으로 판명 된 대답에 의해 "수락 대답"체크 표시를 클릭하는 관례입니다. –