开发者社区> 问答> 正文

druid解析ddl失败-alter table

sql:alter table xxxx add over bigint unsigned comment 'xxxx'; 异常:com.alibaba.druid.sql.parser.ParserException: error OVER

原提问者GitHub用户djjsindy

展开
收起
山海行 2023-07-05 21:51:10 237 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    Druid是一款流行的Java数据库连接池和SQL解析工具,可以用于解析和优化SQL语句。在使用Druid解析DDL语句时,可能会出现解析失败的情况,特别是ALTER TABLE语句。

    在解析ALTER TABLE语句时,可能会出现以下几种情况导致解析失败:

    ALTER TABLE语句的语法错误:如果ALTER TABLE语句的语法错误,Druid解析器可能无法正确解析该语句。可以检查ALTER TABLE语句的语法是否正确,例如表名、列名、约束名等是否正确拼写、是否存在语法错误等。

    ALTER TABLE语句中使用了不支持的操作:Druid解析器可能无法解析ALTER TABLE语句中使用了不支持的操作,例如添加未知类型的列或者修改不存在的列等。可以检查ALTER TABLE语句中是否使用了不支持的操作,如果有,可以调整ALTER TABLE语句的内容。

    数据库驱动不支持解析ALTER TABLE语句:有些数据库驱动并不支持解析ALTER TABLE语句,或者只支持部分ALTER TABLE语句的解析。在这种情况下,Druid解析器可能无法正确解析ALTER TABLE语句。可以尝试升级数据库驱动或者使用其他的SQL解析工具。

    针对上述情况,可以尝试以下解决方案:

    检查ALTER TABLE语句的语法:首先需要检查ALTER TABLE语句的语法是否正确,例如表名、列名、约束名等是否正确拼写、是否存在语法错误等。

    检查ALTER TABLE语句中使用的操作:如果ALTER TABLE语句中使用了不支持的操作,可以尝试调整ALTER TABLE语句的内容,或者使用其他的SQL语句替代。

    尝试使用其他的SQL解析工具:如果Druid解析器无法解析ALTER TABLE语句,可以尝试使用其他的SQL解析工具,例如ANTLR和JSqlParser等。

    2023-07-30 09:38:28
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    对于Druid解析DDL失败的情况,通常是由于SQL语句中存在语法错误或者Druid版本不兼容引起的。根据你提供的信息,可以看出你执行的是一个ALTER TABLE语句,但是在添加列时遇到了问题。

    异常信息中提到了"com.alibaba.druid.sql.parser.ParserException",这意味着Druid解析器在解析该SQL语句时遇到了问题。具体的错误是"error OVER",它可能暗示了该SQL语句中的"OVER"关键字使用不正确。

    "OVER"关键字通常用于窗口函数中,用于指定窗口函数的分区、排序等信息。然而,在ALTER TABLE语句中,我们通常不需要使用"OVER"关键字。

    为了解决这个问题,建议将ALTER TABLE语句修改为以下形式:

    ALTER TABLE xxxx ADD COLUMN `over` BIGINT UNSIGNED COMMENT 'xxxx';
    

    在修改后的语句中,我们使用了"ADD COLUMN"来添加新的列,并且将"over"列的名称用反引号(`)括起来,以避免与关键字冲突。

    如果你仍然遇到问题,请提供更详细的信息,以便我可以更好地帮助你解决。

    2023-07-11 16:50:16
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 12:29:34
    赞同 展开评论 打赏
  • 您遇到的问题是因为不同版本的 MySQL 支持的 DDL 语法不同,而 druid 解析 DDL 语法时默认使用 MySQL 8.0 的语法。在 MySQL 8.0 中,OVER 关键字用于窗口函数,而不用于 ALTER TABLE 的语法中。

    解决此问题的一种方法是通过修改 druid 配置,将 druid 使用的 MySQL 版本指定为您的实际 MySQL 版本。以 MySQL 5.7 为例,可以在 JDBC 数据源的 URL 中追加参数 useOldAliasMetadataBehavior=true,指定使用旧的别名元数据行为,以兼容 MySQL 5.7 的语法规则。具体实现方法如下:

    import com.alibaba.druid.pool.DruidDataSource;

    public class Test { public static void main(String[] args) throws SQLException, ParserException { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/test?useOldAliasMetadataBehavior=true"); dataSource.setUsername("root"); dataSource.setPassword("password");

        Connection connection = dataSource.getConnection();
        Statement statement = connection.createStatement();
        String sql = "alter table test add column over bigint unsigned comment 'xxxx';";
        statement.execute(sql);
    
        statement.close();
        connection.close();
    }
    

    } 复制 在上述示例中,我们创建了一个 Druid 数据源,并将 URL 中的参数 useOldAliasMetadataBehavior 设置为 true。这个参数设置将会让 druid 使用旧版本的 MySQL 语法解析器,以兼容 MySQL 5.7 的语法规则。

    另外,在您的 SQL 语句中,add column 是 ALTER TABLE 语法的一部分,如果您希望在表中添加一列,需要使用这个语法来实现。因此,您的 SQL 语句应该修改为:

    alter table xxxx add column over bigint unsigned comment 'xxxx';

    注意,add 后面应该紧跟关键字 column。

    2023-07-06 11:00:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像