数据库(postgresql)恢复psql影响含有group by的sql查询

背景
发生于数据库恢复后,某些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会将文本中的某些语句看作命令导致出错
备注
写的不太严谨,如果有不正确的地方会继续修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值