【问题标题】:JDBC DatabaseMetaData#getTables() returns: ERROR 1463 (42000): Non-grouping field 'TABLE_TYPE' is used in HAVING clauseJDBC DatabaseMetaData#g​​etTables() 返回: ERROR 1463 (42000): Non-grouping field 'TABLE_TYPE' is used in HAVING 子句
【发布时间】:2019-12-21 00:37:07
【问题描述】:

当通过 JDBC 询问 MariaDB 中的给定表时(通过DatabaseMetaData#getTables),我们收到以下错误消息:

ERROR 1463 (42000): Non-grouping field 'TABLE_TYPE' is used in HAVING clause

我们正在使用 MySQL 连接器/J。

你知道这里有什么问题吗?

【问题讨论】:

  • 错误消息实际上告诉您问题的确切原因(尽管您可能不清楚,因此您的帖子在这里)。 TABLE_TYPE 列出现在HAVING 子句中,但它没有出现在GROUP BY 子句中。你不能那样做。
  • 你错了。这是合法的sql。没有group by clausehaving clause 仅表示group by clause 默认为group by ()。正如您在答案中看到的,这个 sql 甚至由 JDBC 驱动程序生成。
  • 是的,但根据 MySQL 服务器模式,它仍然可能是一个错误。
  • 不,不是。请阅读问题。它不包含任何 SQL。使用 jdbc getTables() 时会发生错误。取决于 MariaDB sql_mode(不是 MySQL),这不是错误。在 MariaDB 的实际版本中,此错误已得到修复。您可以在 sql_mode 中设置值ONLY_FULL_GROUP_BY,尽管进行了此设置,以下给定的语句仍将起作用。请参阅jira.mariadb.org/browse/MDEV-10663 ...这只是 MariabDB 中的一个已知错误,现已修复。
  • 第一个问题是,您使用 JDBC 在 Java 中调用 getTables()。 MariaDB 数据库返回的错误毫无帮助,因为您看不到引发问题的调用背后的 SQL 语句,并问自己:为什么我不能使用 getTables()。我们花了很长时间才找到真正的根本原因。我希望这个答案能帮助其他有同样问题的 JDBC 用户。

标签: mysql jdbc mariadb


【解决方案1】:

当使用低于 10.0.29 的版本并且 sql_mode 包含值 ONLY_FULL_GROUP_BY 时,MariaDB 会出现问题。这是一个已知错误(请参阅https://jira.mariadb.org/browse/MDEV-10663)。

在 MariaDB 中启用登录后,我们会看到以下语句:

SELECT
    TABLE_SCHEMA AS TABLE_CAT,
    NULL AS TABLE_SCHEM,
    TABLE_NAME,
    CASE
        WHEN TABLE_TYPE = 'BASE TABLE' THEN
        CASE
            WHEN TABLE_SCHEMA = 'mysql'
            OR TABLE_SCHEMA = 'performance_schema' THEN 'SYSTEM TABLE'
            ELSE 'TABLE'
        END
        WHEN TABLE_TYPE = 'TEMPORARY' THEN 'LOCAL_TEMPORARY'
        ELSE TABLE_TYPE
    END AS TABLE_TYPE,
    TABLE_COMMENT AS RE MARKS,
    NULL AS TYPE_CAT,
    NULL AS TYPE_SCHEM,
    NULL AS TYPE_NAME,
    NULL AS SELF_REFERENCING_COL_NAME,
    NULL AS REF_GENERATION
FROM
    INFORMATION_SCHEMA.TABLES
WHERE
    TABLE_SCHEMA LIKE '<jdbc.catalog>'
    AND TABLE_NAME = '<jdbc.table>'
HAVING
    TABLE_TYPE IN ('TABLE',
    'VIEW',
    NULL,
    NULL,
    NULL)
ORDER BY
    TABLE_TYPE,
    TABLE_SCHEMA,
    TABLE_NAME

当方法 getTables() 被调用时,这个语句由 JDBC Driver 发出(参见 github:getTables() in the JDBC Driver)。

这个对已知表的查询然后失败并显示给定的错误消息。

修复 1:从 sql_mode 中删除 ONLY_FULL_GROUP_BY

FIX 2:升级到高于或等于 10.0.29 的 MariaDB 版本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多