mysql - MySql触发器语法错误: While_Sym

标签 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, 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”,其中包含不同的可能答案。该字段包含此类数据:“是,否,我不知道”。对于每个新问题,我想在表“Resultat”中为每个可能的答案插入一条新记录。

在我的示例中,三项新记录:一项表示,一项表示,一项表示我不知道

我的代码来自互联网上的示例,但它无法正常工作。 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;

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



一些想法:

<小时/>

MySql 中没有 PATINDEXLEN 函数,它们来自 SQL Server。
大多数函数在 SQL 中都不是标准的,人们不应该期望在数据库 X 上工作的东西也应该在数据库 Y 上工作(反之亦然) 您始终需要查看手册。

<小时/>

MySql 中 @variablevariable 之间存在差异 - 它们不一样(与 SQL Server 相反,SQL Server 中只有一种变量 --> @变量)。
请参阅文档了解 @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

<小时/>

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

DELIMITER $$

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

DELIMITER ;

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

相关文章:

python - PsychoPy 在 64 位操作系统上发送触发器

sql server 触发器引用最后一行

Javascript 事件未触发

MYSQL触发器在两个表中保留相同的数据

postgresql - 提高重复查询的查询效率

MySql 查询检查重复的 ip

MYSQL获取最新作业号

mysql - 跟踪 MySQL 中最后读取的记录

mysql - Mysql2::Error-用户'root'@'localhost'的访问被拒绝(使用密码:是)

php - 在 PHP 中从 SQL 查询结果构建 JSON 对象