mySQL在触发查找哈希标记并将其添加到其他表时出错

mySQL在触发查找哈希标记并将其添加到其他表时出错,mysql,triggers,Mysql,Triggers,我能找到的最接近(完全相同)我正在做的事情是。。。 …除了这个问题没有涉及实际查找哈希标记,只是讨论如何存储它们,这对我没有帮助,尽管它确实让我对自己的设计选择充满信心 我试图创建一个触发器,每次添加消息时,它都会查找hashtags并将它们添加到数据库中的其他两个表中。其中一个表是“hashTags”,它只是一个标签列表&一个ID列。另一个表是hashUsed,它显示了hashtag与两列(MsgID、HTagID)一起使用的位置,这两列都设置为PrimaryKey(不应将消息和hashtag

我能找到的最接近(完全相同)我正在做的事情是。。。 …除了这个问题没有涉及实际查找哈希标记,只是讨论如何存储它们,这对我没有帮助,尽管它确实让我对自己的设计选择充满信心

我试图创建一个触发器,每次添加消息时,它都会查找hashtags并将它们添加到数据库中的其他两个表中。其中一个表是“hashTags”,它只是一个标签列表&一个ID列。另一个表是hashUsed,它显示了hashtag与两列(MsgID、HTagID)一起使用的位置,这两列都设置为PrimaryKey(不应将消息和hashtag链接多次)。我手动插入了一些带有hashtags的“messages”,在其他表中创建了适当的条目来引用数据,并构建了查询,以我所需要的方式显示数据

我只是不明白为什么这个触发器不能保存

当我执行它时,我得到以下响应:

您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在“@hl:=INSTR(@s,#)”附近使用的正确语法/获取hashtag location/@ss:=子字符串(@s,@h'位于第14行)

顺便说一句,我使用的是“Toad for MySQL”,它在后台自动处理分隔符,这就是为什么我这里没有它的原因

我在wazoo上添加了评论,以帮助您跟进。
我做错了什么?提前谢谢

CREATE TRIGGER `mybase`.`FindHashTags` 
AFTER INSERT /* I chose AFTER INSER because I need to use the 
                auto_incremented 'MsgID' field/key, which doesn't 
                exist beforehand.  Correct me if I'm wrong. */
    ON mybase.messages FOR EACH ROW
BEGIN  
    DECLARE c INT; /* c stands for count */
    DECLARE h INT; /* h stands for HowMany times is the hashtag(#) present */

    SET @s := new.message; /* s stands for string */
    SET @h := (ROUND ((LENGTH(new.message) /* Get the Length of the Message */
          - LENGTH( REPLACE (new.message, "#", "") ) /* How long would the message be without the string in it*/
        ) / LENGTH("#"))); /*Divide the difference of those two lengths by the length of the string in question.  
                            This will tell how many times it was removed, hence how many times the string was 
                            present in the text. */

    SET @c := 1;
    WHILE @c <= @h DO
        @hl := INSTR(@s, '#'); /* get hashtag location */
        @ss := SUBSTRING(@s, @hl, LENGTH(@s)-@hl); /* Get all text after hashtag usint SubString*/
        @sl := INSTR(@ss,' '); /* String Length. Search the new substring for a space(' ') */
        IF @sl <= 0 THEN @sl=LENGTH(@S) /* If there isn't a space, set @sl position to end of the field */
          @ht := SUBSTRING(@ss, 1, @sl); /* @ht is a hashTag, select from first char to @sl */
          @s  := SUBSTRING(@ss, @sl, LENGTH(@SS)-@sl); /* remove the hashtag from the sting to prepare for searching 
                                                        again during next loop to look for more hashtags */
          INSERT IGNORE INTO hashTags(Name) VALUES (@ht); /* add hashtag to list, ignore if it already exists */
          @t  := (SELECT HTagID FROM hashTags WHERE Name=@ht); /* get the id of the hashtag we just found */
          INSERT IGNORE INTO hashUsed(MsgID,HTagID) VALUES (new.MsgID,@t); /* link the hashtag to the message */
          SET @c = @c + 1; 
        END IF
    END WHILE;

END;
CREATE触发器'mybase'。'FindHashTags'
插入后/*我选择插入后,因为我需要使用
自动递增的“MsgID”字段/键,该字段/键不会
预先存在。如果我错了,请纠正我*/
在mybase.com上为每行发送消息
开始
声明c INT;/*c代表计数*/
声明h INT;/*h表示hashtag(#)出现的次数*/
SET@s:=new.message;/*s代表字符串*/
设置@h:=(四舍五入((LENGTH(new.message)/*获取消息的长度*/
-长度(REPLACE(new.message,“#”和“”)/*如果消息中没有字符串,消息的长度是多少*/
)/LENGTH(“#”);/*将这两个长度之差除以所讨论字符串的长度。
这将告诉它被删除了多少次,因此字符串被删除了多少次
出现在文本中*/
设置@c:=1;
而@c我发现了。。。

1.我忘了将SET放在WHILE块的变量前面。
2.我还忘了结尾IF后面的分号