| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Tidb 查询sql 报runtime error: index out of range [-1]错误 -> 正文阅读 |
|
[大数据]Tidb 查询sql 报runtime error: index out of range [-1]错误 |
前沿今天下午在查询Tidb数据库时候,突然发现报错了,但是同样的sql在上面执行还没有问题,最后是发现sql 模式的问题,Tidb对group by 返回字段约束力特别强。 正文解决方式当我们查询Tidb的时候,报下面的错误信息
起初我将原sql 在外层包装了一下,使用 select * from (原sql)? group by? uniq_data_id 执行后错误信息变成了
?查询资料是由于tidb版本的问题,但是我没有升级版本呀,难道是自动升级的,见鬼了。 若我们查询当前sql_mode ,执行下面的sql? show VARIABLES LIKE 'sql_mode'; 会发现是only_full_group_by ,如果仔细观察第一次报错信息,就会发现,信息最后已经提示说sql_mode =?only_full_group_by,只是当时我没注意到这点。 sql_mode 模式 是?only_full_group_by,大体意思是 我们在查询select * from a group by a.name 类似于这样的sql语句,是不满足only_full_group_by模式的,该模式要求 group by 的字段要和查询返回的字段要一致,这可能也不是tidb的问题,也是tidb在?only_full_group_by 模式下强约束的结果,我们只要关闭?only_full_group_by 模式即可,通过执行下面sql 临时关闭
?执行完后,我们在运行刚才同样的sql, 就不会出现问题了 若想永久性关闭该模式,那么需要修改mysql的配置文件,找到配置文件/etc/my.cnf,在[mysqld]后追加
保存后存在mysql 即可。 延展参考资料,在SQL 92 对group by 的定义如下
翻译:SELECT、HAVING、ORDER后的非聚合字段必须和GROUP BY后的字段保持完全一致 但是我们经常会看到在mysql中的sql 语句 查询的字段和group by 的字段不一致的情况,这是因为在SQL99中做了新的规定,如下所示
翻译:如果group by后面的字段是主键,而且非聚合字段是依赖group by后字段的,那么可以将这些非聚合字段放在SELECT、HAVING、ORDER BY的语句之后。 但是这个时候主角 ONLY_FULL_GROUP_BY出现了,该模式的意思类似是SQL 92 对group by 的限制。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/16 0:16:07- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |