在Aurora Serverless MySQL 5.6中使用定界符时的语法错误

时间:2019-06-19 04:34:45

标签: mysql amazon-rds-aurora

我正在使用Aurora无服务器MySQL 5.6创建以下触发器,该触发器将在将数据插入到另一个表中但接收语法错误(特别是围绕Delimiter关键字)时更新一个表。

DELIMITER $$
CREATE TRIGGER Create_Media_Like_Trigger AFTER INSERT ON MediaLike
FOR EACH ROW
BEGIN 
    IF NEW.likeType = 'LIKE' THEN
        UPDATE Media 
        SET Media.numLikes = Media.numLikes + 1 
        WHERE Media.mediaId = NEW.mediaId;
    ELSEIF NEW.likeType = 'DISLIKE' THEN
        UPDATE Media 
        SET Media.numLikes = Media.numLikes - 1 
        WHERE Media.mediaId = NEW.mediaId;
    ENDIF;
END $$
DELIMITER ;

就像我上面所说的,我收到有关Delimiter的语法错误,这个问题是AWS特定的,我该如何解决?

更新并显示错误消息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near 'DELIMITER $$ CREATE TRIGGER Create_Media_Like_Trigger 
AFTER INSERT ON MediaLike ' at line 1

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near 'ELSEIF NEW.likeType = 'DISLIKE' THEN UPDATE Media SET 
Media.numLikes = Media.num' at line 1

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near 'END $$' at line 1

2 个答案:

答案 0 :(得分:1)

我花了一天的时间试图弄清楚这一点,因此希望能对那里的人有所帮助...

DELIMITER是客户端的功能,而不是MySQL服务器的功能。 RDS查询编辑器是一个客户端,但是它不支持更改定界符,因此尝试运行您提供的脚本将无法正常工作,因为它第一次看到分号时,会将其解释为命令的结尾,并以失败告终。语法错误。

那么,如何创建类似具有多个语句和分号的存储过程呢?您必须将其创建为.sql文件,并通过Lambda函数或CLI使用Data API将其发送。

首先,在没有任何.sql命令或备用定界符的DELIMITER文件中创建脚本。

例如:function.sql

CREATE PROCEDURE simpleproc (OUT param1 INT)
BEGIN
   SELECT COUNT(*) INTO param1 FROM t;
END

然后,使用CLI像这样运行脚本:

cat function.sql | xargs -0 aws rds-data execute-statement \
    --resource-arn arn:aws:rds:eu-west-1:xxx:cluster:cluster-name \
    --secret-arn arn:aws:secretsmanager:eu-west-1:xxx:secret:secret-name-xxx \
    --database "database_name" \
    --sql

或者,您可以创建一个Lambda函数来读取文件,并使用rds_client.execute_statement()通过Data API将脚本发送到服务器。但是同样,请不要使用DELIMITER语句。服务器将看到BEGINEND行,并相应地采取行动,而无需更改定界符。

答案 1 :(得分:0)

此信息可能并不完全与OP的问题相关,但与OP的问题密切相关,可能会帮助处于类似情况(例如通过搜索)的其他人。

我在Amazon Aurora Serverless MySQL 5.6数据库上运行类似的CREATE FUNCTION查询,并遇到相同的语法错误。我正在使用Table Plus(v2.9.1,内部版本264)作为我的应用程序/客户端。

解决方案是删除2x DELIMITER行。该应用程序/客户端足够智能,可以解决定界符本身。