错误:
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column list which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
问题描述:
在把MySQL升级到5.7或者更高的版本,一些以前看上去不会出错的group by 操作在这个版本以后就会出现语法报错的情况,在这个模式下,使用分组查询时,出现在select字段后面的只能是group by后面的分组字段,或使用聚合函数包裹着的字段。对于语义限制都比较严谨的多家数据库,如SQLServer、Oracled等,都不支持select target list中出现语义不明确的列,这样的语句在这些数据库中是会报错的,所以从MySQL 5.7版本开始修正了这个语义,也就是ONLY_FULL_GROUP_BY语义。
解决:
set @@GLOBAL.sql_mode='';
set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义
补充:
any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据
在select时对不确定的字段添加any_value()即可,例:select id,any_value(code) form table
错误:
You can't specify target table '<table>' for update in FROM clause
说明:
在同一语句中,不能先select出同一表中的某些值,再update这个表
案例:
# 会员动态轮播至少显示5篇,因为过期不足5篇时,恢复最近的过期文章补足5篇
UPDATE cms_article_list
SET is_valid = 1
WHERE (
-> SELECT num from (
SELECT count(*) as num FROM cms_article_list
WHERE UNIX_TIMESTAMP()-180*24*60*60 < article_create_time
AND restore != 1
AND article_type = 0
AND article_status = 1
AND column_id = 19
AND article_thumb != ''
-> ) AS nt
) = 0
AND restore != 1
AND article_type = 0
AND article_status = 1
AND column_id = 19
AND article_thumb != ''
ORDER BY article_id DESC
LIMIT 5;
解决:需要添加 -> 标注的代码
也就是说将select出的结果再通过中间表(要为中间表取个别名否则报错)select一遍
这个问题只出现于mysql,mssql和oracle不会出现
错误:
Table 'performance_schema.session_variables' doesn't exist
说明:
MySQL 5.5新增一个存储引擎:命名PERFORMANCE_SCHEMA ,主要用于收集数据库服务器性能参数。MySQL用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表
performance_schema提供以下功能:
1.提供进程等待的详细信息,包括锁、互斥变量、文件信息;
2.保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;
3.对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期,例如(CYCLE、MICROSECOND)
解决:
mysql_upgrade -uroot -p
service mysql restart
错误:
Native table 'performance_schema'.'session_variables' has the wrong structure
说明:
--从mysql5.7.6开始information_schema.global_status已经开始被舍弃,
为了兼容性,此时需要打开 show_compatibility_56
解决:
set @@global.show_compatibility_56=ON;
错误:
Access denied for user ''@'localhost' to database 'mysql'
说明:
因为mysql数据库的user表里,存在用户名为空的账户即匿名账户,导致登录的时候是虽然用的是root,但实际是匿名登录的
解决:
使用 mysql -p 127.0.0.1 -uroot 登陆
delete from user where USER='';
FLUSH PRIVILEGES;
补充:
修改密码
update user set password=PASSWORD("自定义用户密码") where User='root';
错误:
Can't connect to MySQL server on 'X.X.X.X' (110)
解决:
netstat -petulan 查看 端口情况 发现mysql监听在tcp6上
在etc/my.cnf中mysqld下面添加bind-address=0.0.0.0
重新启动mysql服务 systemctl restart mysql
正常监听tcp地址
最后发现是/etc/sysconfig/iptables 文件中有这一条数据
-A INPUT -p tcp -m tcp --dport 3306 -j DROP
改成
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
重启一下
systemctl restart iptables
就好了
关键是关闭防火墙居然没有用???