MySQL功能特性

时间:2018-07-14 18:09:43

标签: mysql function

我想创建一个基本上返回随机字符串的函数。我不知道在这种情况下要分配什么特征。我也在使用二进制日志记录的环境中。

这是我的函数的简化版本:

CREATE FUNCTION `MYRAND`() RETURNS char(10) NOT DETERMINISTIC
  RETURN CONCAT('rand_', FLOOR(RAND() * 10000));

在我的环境中创建函数时出现此错误。

  

此函数中没有DETERMINISTIC,NO SQL或READS SQL DATA   其声明和二进制日志记录已启用(您可能要使用   不太安全的log_bin_trust_function_creators变量)

可能的特征:

  • NOT DETERMINISTIC-使用此函数是因为此函数返回随机值
  • READS/MODIFIES SQL DATA-函数无法从表中读取数据
  • NO SQL-我正在调用其他SQL函数(RAND),所以我不确定是否应该指定它...

任何有关在启用二进制日志记录后如何正确定义此功能的建议,将不胜感激。

2 个答案:

答案 0 :(得分:2)

MySQL希望您将函数声明为DETERMINISTIC,NO SQL或READS SQL DATA。

确定吗?否-因为它是随机的。

id是否读取SQL数据?否-由于您没有SELECT语句。

它是否修改SQL DATA?否-由于您没有INSERT,UPDATE或DELETE语句。

由于您的函数不涉及数据库中的任何数据,因此它是NO SQL

因此,您应该将其声明为NOT DETERMINISTICNO SQL

CREATE FUNCTION `MYRAND`() RETURNS char(10) NOT DETERMINISTIC NO SQL
  RETURN CONCAT('rand_', FLOOR(RAND() * 10000));

答案 1 :(得分:0)

使用类似以下代码的东西:

CREATE FUNCTION get_string(in_strlen int) RETURNS VARCHAR(500) DETERMINISTIC
    BEGIN 
    set @var:='';
    while(in_strlen>0) do
    set @var:=concat(@var,IFNULL(ELT(1+FLOOR(RAND() * 1000),1,2,3,4,5,6,7,8,9));
    set in_strlen:=in_strlen-1;
    end while;  
    RETURN @var;
    END