Error Code : 1064 触发器出错如下 急

-无-为- 2009-11-13 06:45:43

insert into r_message values(txt,phone);

其中 txt字符串为:A#B#C#
格式要求:
A:1001-9999的数字
B:10001-99999的数字
C:001-999的数字

备注:B#C#在字符串中最少出现一次,最多出现5次

运行触发器报错如下:

Error Code : 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 '@flag1='False';
end if;
if length(@mstxt)!=15 or length(@mstxt)!' at line 19

Execution Time : 00:00:00:000
Transfer Time : 00:00:00:000
Total Time : 00:00:00:000




DELIMITER $$

USE `test`$$

DROP TRIGGER /*!50032 IF EXISTS */ `ana_trigger`$$

CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `ana_trigger` AFTER INSERT ON `r_message`
FOR EACH ROW BEGIN
IF NOT EXISTS(SELECT * FROM employee WHERE phone=SUBSTR(new.phone,3,11) ) THEN
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','您非本公司员工,无权完成此操作',NULL,new.txt));
UPDATE r_message SET errType=6;
ELSE
SET @eeid=1;
SET @eename='';
SET @mstxt=new.txt;
SET @flag1='';

SELECT eid INTO @eeid FROM employee WHERE phone=SUBSTR(new.phone,3,11) ;
SELECT ename INTO @eename FROM employee WHERE phone=SUBSTR(new.phone,3,11) ;

IF new.txt NOT REGEXP '^[0-9]*#[0-9]*#[0-9]*#' THEN
@flag1='False';
END IF;
IF LENGTH(@mstxt)!=15 OR LENGTH(@mstxt)!=25 OR LENGTH(@mstxt)!=35 OR LENGTH(@mstxt)!=45 OR LENGTH(@mstxt)!=55 THEN
@flag1='False';
END IF;
IF @flag1='False' THEN
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','编码错误',NULL,new.txt));
UPDATE r_message SET errType=2;
ELSE
SET @ccid=SUBSTR(@mstxt,1,4);/* 不需要转成int型*/
IF NOT EXISTS(SELECT * FROM customer WHERE cid=@ccid) THEN
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','客户编码错误',NULL,new.txt));
UPDATE r_message SET errType=3;
ELSE

SET @ccname='';
SELECT cname INTO @ccname FROM customer WHERE cid=@ccid; /* 取出客户名*/

IF LENGTH(@mstxt)=15 THEN
SET @ppid=SUBSTR(@mstxt,6,5);
SET @ppcount=CONVERT( SUBSTR(@mstxt,12,3),INT);
SET @flag15='';
IF NOT EXISTS(SELECT * FROM product WHERE pid=@ppid) THEN
@flag15='False';
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','产品编码错误',NULL,new.txt));
UPDATE r_message SET errType=4;
END IF;
IF @ppcount<1 OR @ppcount>999 THEN
@flag15='False';
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','数量编码错误',NULL,new.txt));
UPDATE r_message SET errType=5;
END IF;
IF @flag15!='False' THEN
SET @ppname='';
SELECT pname INTO @ppname FROM product WHERE pid=@ppid; /* 取出商品名*/

INSERT INTO r_order(eid,ename,cid,cname,pid,pname,pcount,MID)VALUES(@eeid,@eename,@ccid,@ccname,@ppid,@ppname,@pcount,new.mid);
UPDATE r_message SET errType=1;
END IF;
END IF;
/*
IF LENGTH(@mstxt)=25 THEN

END IF;
IF LENGTH(@mstxt)=35 THEN

END IF;
IF LENGTH(@mstxt)=45 THEN

END IF;
IF LENGTH(@mstxt)=55 THEN

END IF;
*/
END IF;
END IF;
END IF;
END;
$$

DELIMITER ;
...全文
617 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
-无-为- 2009-11-14
  • 打赏
  • 举报
回复
(⊙v⊙)嗯 谢谢您 我是今年7月毕业的C# 菜鸟, 真是麻烦你了 从昨天到今天。
ACMAIN_CHM 2009-11-14
  • 打赏
  • 举报
回复
auto_increment 要在 after insert后才会产生。所以在 before insert 之前是不会有值的,因为你这时候还没有把记录提交给MYSQL数据更新。
-无-为- 2009-11-14
  • 打赏
  • 举报
回复

mysql> select * from r_order;
+-----+------+--------+------+----------+-------+--------+--------+------+
| rid | eid | ename | cid | cname | pid | pname | pcount | mid |
+-----+------+--------+------+----------+-------+--------+--------+------+
| 1 | 1 | test01 | 1001 | 芊芊超市 | 10001 | 矿泉水 | 1 | 0 |
| 2 | 1 | test01 | 1001 | 芊芊超市 | 10001 | 矿泉水 | 1 | 0 |
+-----+------+--------+------+----------+-------+--------+--------+------+
2 rows in set (0.00 sec)

-无-为- 2009-11-14
  • 打赏
  • 举报
回复
还有个问题 我还想问一下
INSERT INTO r_order(eid,ename,cid,cname,pid,pname,pcount,MID)VALUES(@eeid,@eename,@ccid,@ccname,@ppid,@ppname,@ppcount,new.mid);
这个地方 怎么插入的new.mid一直是0啊 在原表中 mid是一个自增的主键 插入正确信息后 原表中mid是自增的 但是 怎么这里一直都是0啊,在 r_order表中
-无-为- 2009-11-14
  • 打赏
  • 举报
回复
谢谢您 ACMAIN_CHM兄
[Quote=引用 11 楼 acmain_chm 的回复:]
引用Updating of NEW row is not allowed in after trigger

你的触发器应该改成 before
TRIGGER `ana_trigger`AFTERINSERT ON `r_message`
[/Quote]
ACMAIN_CHM 2009-11-14
  • 打赏
  • 举报
回复
[Quote]Updating of NEW row is not allowed in after trigger[/Quote]

你的触发器应该改成 before
TRIGGER `ana_trigger` AFTER INSERT ON `r_message`
-无-为- 2009-11-14
  • 打赏
  • 举报
回复
不能在表A的触发器中 再对本表(表A)进行insert / update /delete 操作。

谢谢您

修改后 报错 应该是您所说的“ 不能在表A的触发器中 再对本表(表A)进行insert / update /delete 操作。”
Error Code : 1362
Updating of NEW row is not allowed in after trigger
ACMAIN_CHM 2009-11-14
  • 打赏
  • 举报
回复
IF NOT EXISTS(SELECT * FROM employee WHERE phone=SUBSTR(new.phone,3,11) ) THEN
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','您非本公司员工,无权完成此操作',NULL,new.txt));
UPDATE r_message SET errType=6;

set new.errType=6;

ELSE
-无-为- 2009-11-14
  • 打赏
  • 举报
回复
我建的触发器 如下 请问 是不是 不能在触发器中 完成 我这样的操作啊?
我是真的很。。。 第一次接触mysql 请帮忙指教啊 谢谢了 ACMAIN_CHM兄




DELIMITER $$

USE `test`$$

DROP TRIGGER /*!50032 IF EXISTS */ `ana_trigger`$$

CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `ana_trigger` AFTER INSERT ON `r_message`
FOR EACH ROW BEGIN
IF NOT EXISTS(SELECT * FROM employee WHERE phone=SUBSTR(new.phone,3,11) ) THEN
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','您非本公司员工,无权完成此操作',NULL,new.txt));
UPDATE r_message SET errType=6;
ELSE
SET @eeid=1;
SET @eename='';
SET @mstxt=new.txt;
SET @flag1='';

SELECT eid INTO @eeid FROM employee WHERE phone=SUBSTR(new.phone,3,11) ;
SELECT ename INTO @eename FROM employee WHERE phone=SUBSTR(new.phone,3,11) ;

IF new.txt NOT REGEXP '^[0-9]*#[0-9]*#[0-9]*#' THEN
SELECT 'False' INTO @flag1;
END IF;
IF LENGTH(@mstxt)!=15 OR LENGTH(@mstxt)!=25 OR LENGTH(@mstxt)!=35 OR LENGTH(@mstxt)!=45 OR LENGTH(@mstxt)!=55 THEN
SELECT 'False' INTO @flag1;
END IF;
IF @flag1='False' THEN
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','编码错误',NULL,new.txt));
UPDATE r_message SET errType=2;
ELSE
SET @ccid=SUBSTR(@mstxt,1,4);/* 不需要转成int型*/
IF NOT EXISTS(SELECT * FROM customer WHERE cid=@ccid) THEN
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','客户编码错误',NULL,new.txt));
UPDATE r_message SET errType=3;
ELSE
SET @ccname='';
SELECT cname INTO @ccname FROM customer WHERE cid=@ccid; /* 取出客户名*/

IF LENGTH(@mstxt)=15 THEN
SET @ppid=SUBSTR(@mstxt,6,5);
SET @ppcount=CONVERT( SUBSTR(@mstxt,12,3),SIGNED);
SET @flag15='';

IF NOT EXISTS(SELECT * FROM product WHERE pid=@ppid) THEN
SELECT 'False' INTO @flag15;
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','产品编码错误',NULL,new.txt));
UPDATE r_message SET errType=4;
END IF;
IF @ppcount<1 OR @ppcount>999 THEN
SELECT 'False' INTO @flag15;
INSERT INTO er_message(r_mes) VALUES(CONCAT_WS(' ','数量编码错误',NULL,new.txt));
UPDATE r_message SET errType=5;
END IF;
IF @flag15!='False' THEN
SET @ppname='';
SELECT pname INTO @ppname FROM product WHERE pid=@ppid; /* 取出商品名*/

INSERT INTO r_order(eid,ename,cid,cname,pid,pname,pcount,MID)VALUES(@eeid,@eename,@ccid,@ccname,@ppid,@ppname,@pcount,new.mid);
UPDATE r_message SET errType=1;
END IF;
END IF;
/*
IF LENGTH(@mstxt)=25 THEN

END IF;
IF LENGTH(@mstxt)=35 THEN

END IF;
IF LENGTH(@mstxt)=45 THEN

END IF;
IF LENGTH(@mstxt)=55 THEN

END IF;
*/
END IF;
END IF;
END IF;
END;
$$

DELIMITER ;
ACMAIN_CHM 2009-11-14
  • 打赏
  • 举报
回复
[Quote]这个是什么意思啊 是我的触发器 有问题吗 还是我不能在触发器中完成这样的操作啊[/Quote]
不能在表A的触发器中 再对本表(表A)进行insert / update /delete 操作。
-无-为- 2009-11-14
  • 打赏
  • 举报
回复

这个是什么意思啊 是我的触发器 有问题吗 还是我不能在触发器中完成这样的操作啊

我把触发器 考在下面 请你帮我 看看啊
过程是这样的:
如果非本公司员工发来的短信,将此字段置为6,格式错误置为2,如果客户编码错误置为3,产品编码错误置为4,数量编码错误置为5,没有出错置为1。
同时有错的话 将错误信息写入到出错表,没有出错的话,就将他解析出来,并写入订单表


[Quote=引用 5 楼 acmain_chm 的回复:]
触发器 中不能对本表进行操作,这是MYSQL的限制,否则没完没了的递归 触发了。
[/Quote]
ACMAIN_CHM 2009-11-14
  • 打赏
  • 举报
回复
触发器 中不能对本表进行操作,这是MYSQL的限制,否则没完没了的递归 触发了。
-无-为- 2009-11-14
  • 打赏
  • 举报
回复

谢谢您 我按照你的 修改了 触发器没有报错
现在的问题是 我插入 如果我删掉上面建的触发器 它就不报错 请帮帮忙
我是刚开始接触mysql 操作mysql我都是照搬sql server和oracle的操作来的 特别是sql语法
insert into r_message(txt,phone) values('1001#10001#001#','8613525632356');
报错如下:

mysql> insert into r_message(txt,phone) values('1001#10001#001#','8613525632356'
);
ERROR 1442 (HY000): Can't update table 'r_message' in stored function/trigger be
cause it is already used by statement which invoked this stored function/trigger
.

金山翻译如下:
错误1442(HY000):不能更新表'的存储函数r_message'/触发的
原因是已经使用声明援引这一存储函数/触发器



[Quote=引用 3 楼 acmain_chm 的回复:]
语法错误的情况,你可以自行查一下MYSQL的手册就会知道答案!

SET @ppcount=CONVERT( SUBSTR(@mstxt,12,3),INT);

改成

SET @ppcount=CONVERT( SUBSTR(@mstxt,12,3),SIGNED);

[/Quote]
ACMAIN_CHM 2009-11-13
  • 打赏
  • 举报
回复
语法错误的情况,你可以自行查一下MYSQL的手册就会知道答案!

SET @ppcount=CONVERT( SUBSTR(@mstxt,12,3),INT);

改成

SET @ppcount=CONVERT( SUBSTR(@mstxt,12,3),SIGNED);
ruanchao 2009-11-13
  • 打赏
  • 举报
回复
路过帮顶一下
-无-为- 2009-11-13
  • 打赏
  • 举报
回复

@flag1='False';
这种形式 为: SELECT 'False' INTO @flag1;


现在 出错的地方是:

Error Code : 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 'int);
set @flag15='';
' at line 38

56,681

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧