我们的数据库具有生成订单号的功能.它从"设置"表中读取值,递增它,然后返回新值.例如:
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
Run Code Online (Sandbox Code Playgroud)
注意:不要批评这个功能我知道它有缺陷只是为了说明.
我们使用这个函数如下:
INSERT INTO Orders(OrderNumber, ...)
SELECT NextOrderNumber(), ...
Run Code Online (Sandbox Code Playgroud)
启用二进制日志记录时,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以禁止警告吗?我尝试了它,它的工作原理.这会导致任何问题吗?
你如何返回最后生成的 UUID() (主键) - 是否有类似 mysql_insert_id 的东西?
表uuidtable:
主键:uuid uuid() id_u(索引):整数
多个 id_u 与一个主键 uuid() 匹配
插入: insert into uuidtable (uuid,id_u) values (uuid(),id)
其中 id 是一个数字,当然,uuid 被转义
uuid