我正在 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 中没有 PATINDEX
和 LEN
函数,它们来自 SQL Server。
大多数函数在 SQL 中都不是标准的,人们不应该期望在数据库 X 上工作的东西也应该在数据库 Y 上工作(反之亦然)
您始终需要查看手册。
MySql 中 @variable
和 variable
之间存在差异 - 它们不一样(与 SQL Server 相反,SQL Server 中只有一种变量 --> @变量
)。
请参阅文档了解 @user_definied_variables
和 local_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/