This function has none of DETERMINISTIC, NO SQL.....(you *might* want to use the less safe log_bin_t

Posted Mr.zhou_Zxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了This function has none of DETERMINISTIC, NO SQL.....(you *might* want to use the less safe log_bin_t相关的知识,希望对你有一定的参考价值。

问题起源:

题:

表: Employee

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
Id是该表的主键列。
该表的每一行都包含有关员工工资的信息。

 

编写一个SQL查询来报告 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询应该报告为 null 。

查询结果格式如下所示。

 

示例 1:

输入: 
Employee table:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
n = 2
输出: 
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

示例 2:

输入: 
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
+----+--------+
n = 2
输出: 
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| null                   |
+------------------------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/nth-highest-salary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解:

-- 函数
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    set N = N - 1;
  RETURN (
    select ifnull((select distinct Salary from Employee order by Salary desc limit N,1),null)
    as getNthHighestSalary
  );
END
-- 执行
select getNthHighestSalary(2)

问题出现:

问题分析:

这是因为开启了bin-log日志,我们就必须确定函数中以下点

deterministic 不确定的

no sql 没有SQL语句

reads sql data 只读数据

modifies sql data 修改数据

contains sql 包含SQL语句

因为在function中,只有deterministic ,no sql,reads sql data被支持。所以开启bin-log后必须为function指定参数

问题解决:

show variables like ‘log_bin_trust_function_creators’;

set global log_bin_trust_function_creators = 1

show variables like ‘log_bin_trust_function_creators’;

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    set N = N - 1;
  RETURN (
    select ifnull((select distinct Salary from Employee order by Salary desc limit N,1),null)
    as getNthHighestSalary
  );
END

select getNthHighestSalary(2)

补充:

采用以上方法在数据库重启后还会失效,可以使用以下方法长期有效

root@hadoop_zxy ~]# vim /etc/my.cnf

在最后添加

log_bin_trust_function_creators = 1

以上是关于This function has none of DETERMINISTIC, NO SQL.....(you *might* want to use the less safe log_bin_t的主要内容,如果未能解决你的问题,请参考以下文章