我们的数据库具有生成订单号的功能。它从设置表中读取一个值,将其递增,然后返回新值。例如:
CREATE FUNCTION NextOrderNumber() RETURNS INTEGER UNSIGNED NOT DETERMINISTIC
BEGIN
DECLARE number INTEGER UNSIGNED;
UPDATE Settings SET IntegerValue=LAST_INSERT_ID(IntegerValue+1) WHERE KeyName='NextOrderNumber';
SET number=LAST_INSERT_ID();
return number;
END
注意:不要批评这个功能我知道它有缺陷它只是为了说明。
我们使用这个函数如下:
INSERT INTO Orders(OrderNumber, ...)
SELECT NextOrderNumber(), ...
启用二进制日志记录后,CREATE FUNCTION 会出现此错误:
此函数在其声明中没有 DETERMINISTIC、NO SQL 或 READS SQL DATA,并且启用了二进制日志记录(您可能希望使用不太安全的 log_bin_trust_function_creators 变量)
不管binlog_format设置什么,上面的功能真的有问题吗?根据我对相关MySQL 页面的阅读,我看不出这个函数与复制不兼容的任何原因,无论是 ROW 还是 STATEMENT 级别的二进制日志记录。
如果函数是安全的,设置全局 log_bin_trust_function_creators=1 会让我感到不安。我不想为所有功能禁用此检查,仅此一项。我可以改为将函数标记为 NO SQL 以抑制警告吗?我试过了,它奏效了。这会导致任何问题吗?