语法错误MySql触发器:While_Sym

语法错误MySql触发器:While_Sym,mysql,triggers,Mysql,Triggers,我正在Wamp服务器上用PHP和MySql开发一个小项目。我刚刚发现了SQL触发器的奇妙原理。哼好如果我能用它,那就太好了 事实上,我对以下脚本有一个问题: BEGIN SET @liste = NEW.reponse WHILE LEN(@liste) > 0 BEGIN IF PATINDEX('%,%',@liste) > 0 BEGIN SET @choix = SUBSTRING(@liste,

我正在Wamp服务器上用PHP和MySql开发一个小项目。我刚刚发现了SQL触发器的奇妙原理。哼好如果我能用它,那就太好了

事实上,我对以下脚本有一个问题:

BEGIN
    SET @liste = NEW.reponse
    WHILE LEN(@liste) > 0
    BEGIN
        IF PATINDEX('%,%',@liste) > 0
        BEGIN
            SET @choix = SUBSTRING(@liste, 0, PATINDEX('%,%', &liste))
            INSERT INTO resultat (referendum, choix) VALUES (NEW.id, @choix)
            SET @liste = SUBSTRING(@liste, LEN(@choix + ',') + 1, LEN(@liste))
        END
    END
END
我想在表
中插入一条记录后执行此触发器“公投”
。此表中有一个字段
“reponse”
,其中包含不同的可能答案。此字段包含此类数据:
“是,否,我不知道”
。对于每个新问题,我想在表
“Resultat”
中为每个可能的答案插入一条新记录

在我的示例中,有三条新记录:一条用于
Yes
,一条用于
No
,另一条用于
我不知道

我的代码来自互联网上的一个示例,但它不能正常工作。SQL返回一个语法错误,其中包含消息
“While_Sym expected”…


我试图在我在互联网上找到的东西后面加上分号,但没有办法…

我想你需要这样的东西:

CREATE TRIGGER mytrigger AFTER INSERT 
ON Referendum FOR EACH ROW
BEGIN
  DECLARE cnt int;
  DECLARE str varchar(100);
  Set cnt = CHAR_LENGTH(NEW.reponse) 
          - CHAR_LENGTH(Replace(NEW.reponse,',','')) +1;
  WHILE cnt > 0 DO
    Set str = SUBSTRING_INDEX(
        SUBSTRING_INDEX( New.reponse,',', -cnt)
      ,',',1);
    INSERT INTO resultat (referendum, choix) 
    VALUES (NEW.id, str);
    Set cnt = cnt - 1;
  END WHILE;
END;
演示:



一些想法:


MySql中没有
PATINDEX
LEN
函数,它们来自SQL Server。
大多数函数在SQL中都不是标准函数,人们不应该期望在数据库X上工作的函数也应该在数据库Y上工作(反之亦然) 你总是需要检查手册


MySql中的
@variable
variable
之间存在差异-它们不一样(与SQL Server相反,SQL Server中只有一种变量-->
@variable
)。
有关
@user\u defined\u variables
local\u variables



根据您的客户端软件,您可能还需要使用
分隔符xx
命令,例如,在mysql console client或mysql Workbench中,您需要这样的命令来创建一个没有语法错误的触发器:

DELIMITER $$

CREATE TRIGGER mytrigger AFTER INSERT 
    ON Referend ......
 ......
 ......
END;
$$

DELIMITER ;

请将整个错误堆栈添加到您的帖子中。谢谢您的回答。我现在在工作,所以不可能尝试。然而,你给了我非常有用的提示,让我扩展知识,搜索更多关于触发器的信息。实际上,我不知道它们是SQLServer和MySql之间的区别。多谢各位。