mariadb 未定义 ANY_VALUE

引言

近期一个个人项目上使用了MySQL,但是在kali上运行时报错,经过溯源找到了具体语句异常,mariadb不支持这个函数,因此写了这片博客,供MYSQL切换mariadb的用户参考。

举个例子

定义一张表a,他的结构是id和name,其中id是唯一的,name可重复。分别在mariadb和mysql上。

mysql> select * from a;
+------+--------+
| id   | name   |
+------+--------+
|    1 | zunmx  |
|    2 | matrix |
|    3 | zunmx  |
|    4 | matrix |
+------+--------+
MariaDB [test]> select * from a;
+------+--------+
| id   | name   |
+------+--------+
|    1 | zunmx  |
|    2 | matrix |
|    3 | zunmx  |
|    4 | matrix |
+------+--------+

此时,如果我需要进行分组name,并且随意返回一个id

在MySQL中,可以使用

mysql> select any_value(id), name from a group by name;
+---------------+--------+
| any_value(id) | name   |
+---------------+--------+
|             1 | zunmx  |
|             2 | matrix |
+---------------+--------+
2 rows in set (0.00 sec)

同理,在mariadb中,就会报错。

MariaDB [test]>  select any_value(id), name from a group by name;
ERROR 1305 (42000): FUNCTION test.any_value does not exist

解决方案

  1. 去掉sql_mode中的ONLY_FULL_GROUP_BY,并且去掉any_value

    sql SET SESSION sql_mode = REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', '');
    2. 使用聚合函数,如min,max,avg,sum等

结语

实际上any_value是一种避免报错的手段,不关心这个字段的值是什么。这个函数放宽了SQL的聚合约束,实际上更规范的是使用聚合。

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。