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;
끝;
지금 얻을 오류는
테이블 스키마 (적어도 관련 부분)를 표시하십시오. – peterm
이것은 구문 오류이므로 테이블 구조가 실제로 적절하지 않습니다. ;-) – GolezTrol
아마'IF NEW.invno! = ''THEN' 라인의 마법 따옴표 때문일 것입니다. 이것을 워드 프로세서에서 입력했거나 복사 했습니까? 보통 따옴표를 사용하십시오 :' '''. – GolezTrol