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 以取消警告?我尝试过并且有效。这会引起任何问题吗?