背景:
发生于数据库恢复后,某些sql语句执行时间过长,导致系统卡死。
查阅:
查看sql发现多数语句select后写了一些group by未写的列,即未分组也查询,自此延申出不同数据库对group by的一些扩展延申。
sql标准:select后不允许有group by后没有的分组列
oracle:同上不允许
mysql:https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
postgresql:https://www.postgresql.org/docs/11/queries-table-expressions.html#QUERIES-GROUP
查看官方文档发现mysql、postgresql是允许这样的写法的:
select后如果有主键或者唯一not null列,那么在select后可以写group by后未写的列,因为通过主键或者唯一not null列可以确定数据只有一行,所以不影响查询。如果select后没有主键过着唯一not null列,那么group by就不能确定数据,则不能查询。
其中mysql中说明如果group by后没有写分组列,又想查询出来数据,可以使用any_value()函数,它会随机选择其中的一条数据进行展示,详细见官方文档。
解决:
数据库使用postgresql是可以满足select后有主键或者唯一not null列,group by后不写分组列select也能展示的。导致sql查询失效卡死即不满足这个条件。发现是由postgresql恢复数据库使用psql命令恢复纯文本格式脚本的时候没有恢复其对应的约束(主键、非空、唯一)导致。使用restore重新恢复保证约束存在。
ps:psql会将文本中的某些语句看作命令导致出错
备注:
写的不太严谨,如果有不正确的地方会继续修改。
数据库(postgresql)恢复psql影响含有group by的sql查询
最新推荐文章于 2024-05-06 21:25:17 发布