gpt4 book ai didi

mysql 触发语法错误

转载 作者:行者123 更新时间:2023-11-30 22:56:08 26 4
gpt4 key购买 nike

我在创建 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 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REPLACE ON 'orderstest.tracking' FOR EACH ROW BEGIN DECLARE orderid INTEGER' at line 1

我正在使用 PHPMyAdmin 尝试添加触发器。

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;

结束;

我现在得到的错误是

1064 - 您的 SQL 语法有误;检查与您的 MySQL 服务器版本对应的手册,了解在第 4 行的 '' 附近使用的正确语法

最佳答案

没有REPLACE 触发器。您可以选择 INSERTUPDATEDELETE

如果您执行 REPLACE,它将导致表上的 DELETEINSERT 触发器都运行。

此外,您不能像现在这样引用表名。

ON 'orderstest.tracking'

应该是

ON `orderstest`.`tracking`

你应该了解 how to use DELIMITER在您尝试定义包含复合语句的触发器之前。

关于mysql 触发语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26316835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com