【问题标题】:Syntax error when using Delimiters with Aurora Serverless MySQL 5.6将分隔符与 Aurora Serverless MySQL 5.6 一起使用时出现语法错误
【发布时间】:2019-06-19 04:34:45
【问题描述】:

我正在使用 Aurora Serverless 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

【问题讨论】:

  • 如果您添加实际的错误消息可能会有所帮助。此外,您如何运行此代码。 (分隔符特定于客户端,而不是服务器。)
  • @Solarflare 我在 RDS 控制台上运行它,刚刚用错误消息更新了帖子

标签: mysql aws-aurora-serverless


【解决方案1】:

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

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

那么,如何创建像存储过程这样的东西,其中包含多个语句和分号?您必须将其创建为 .sql 文件并使用数据 API 从 Lambda 函数或 CLI 发送。

首先,在.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() 通过数据 API 将脚本发送到服务器。但同样,不要使用DELIMITER 语句。服务器看到BEGINEND 行并相应地采取行动,而无需更改分隔符。

【讨论】:

  • +1 很长一段时间以来,我一直在寻找如何将存储过程上传到 Aurora Serverless DB。谢谢!
  • 在调用 aws rds-data 命令之前指向文件的 windows 版本是什么? cat 不是 Windows 的命令
【解决方案2】:

此信息可能与 OP 的问题并不严格相关,但它密切相关,并且可以帮助处于类似情况的其他人(即通过搜索)。

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

解决方案是删除 2x DELIMITER 行。应用程序/客户端足够智能,可以自行计算分隔符。

【讨论】:

    【解决方案3】:

    在搞乱DELIMITER关键字一段时间后,我发现了以下作品。

    DROP FUNCTION sf_CheckUser;
    DELIMITER / / 
    CREATE FUNCTION db1.sf_CheckUser (
        userUUID VARCHAR(255),
        groupUUID VARCHAR(255),
        requiredTHING INT
    ) RETURNS TINYINT(1) 
    BEGIN
    DECLARE permit TINYINT(1);
            
      -- BODY OF FUNCTION
    
    END / / DELIMITER;

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 2012-02-19
      • 2013-04-05
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      相关资源
      最近更新 更多