2014-02-27 98 views
0

我在一个Wamp服务器上用PHP和MySql开发一个小项目。我刚刚发现了SQL触发器的奇妙原理。嗯...好。如果我可以使用它将会很棒。语法错误MySql触发器:While_Sym

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

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 

我想记录的表"Referendum"插入后执行该触发器。在此表中,有一个字段"reponse",其中包含不同的可能答案。该字段包含这种类型的数据:"Yes,No,I don't know"。对于每个新问题,我想在表"Resultat"中为每个可能的答案插入新记录。

在我的示例中,有三个新记录:一个用于Yes,一个用于No,另一个用于I don't know

我的代码来自互联网上的一个例子,但它不能正常工作。 SQL返回与消息的语法错误"While_Sym expected"...

我尝试添加分号以下是我的互联网,但没有办法上找到...

+0

您能否请添加en轮胎错误堆栈到您的发布。 –

回答

0

我想你需要的东西是这样的:

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; 

演示:http://sqlfiddle.com/#!2/c7321/1



的几点思考:


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


@variablevariable之间在MySQL区别 - 它们是不一样的(相对于SQL服务器那里是只有一种变量 - >@variable)。
请参考文档了解@user_definied_variableslocal_variables
http://dev.mysql.com/doc/refman/5.7/en/user-variables.html
http://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html


根据您的客户端软件,你可能需要在MySQL的控制台客户端或MySQL,工作台也使用DELIMITER xx命令,例如需要类似这样来创建没有语法错误的触发器:

DELIMITER $$ 

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

DELIMITER ; 
+0

谢谢你的回答。我目前在工作中很难尝试。但是,您给了我非常有用的提示,这些提示使我可以扩展知识并更多地了解触发器。实际上,我不知道他们是SQL Server和MySql之间的区别。万分感谢。 – DescampsAu