如何在MySQL中创建非确定性函数

如何在MySQL中创建非确定性函数,mysql,function,guid,Mysql,Function,Guid,我正在尝试为我的MySQL数据库设置GUID生成器。我正在尝试使用MySQL中的用户定义函数生成GUID: CREATE FUNCTION getNextGlobalIdSequence () RETURNS BIGINT(8) BEGIN UPDATE _global_id_sequence set _global_id=last_insert_id(_global_id+1); RETURN last_insert_id(); END 由于这是一个非确定性函数,M

我正在尝试为我的MySQL数据库设置GUID生成器。我正在尝试使用MySQL中的用户定义函数生成GUID:

CREATE FUNCTION getNextGlobalIdSequence
    () RETURNS BIGINT(8) 
BEGIN
    UPDATE _global_id_sequence set _global_id=last_insert_id(_global_id+1);
    RETURN last_insert_id();
END
由于这是一个非确定性函数,MySQL出现以下错误:

“此函数不具有确定性、无SQL或读取中的SQL数据 它的声明和二进制日志记录已启用(您可能希望使用 不太安全的日志\u bin\u trust\u函数\u creators变量)”

我读到这是因为MySQL不能保证数据的可复制性。我认为可以通过将binlog_格式从STATEMENT更改为MIXED(或ROW)来避免这种情况,这是有意义的,因为我假设MySQL会将非确定性执行记录为ROW,因此能够有效地复制。然而,我仍然得到上述错误

我的问题是,如何创建和使用这个函数(如果有的话)?如果不能,有什么替代方法可以让自定义的滚动GUID生成器为MySQL工作


另外,我知道Snowflake,但我真的想知道是否可以直接在MySQL中实现

MySQL中代理键的常用方法是使用


对于数据库级别的全局ID,则只需要为所有ID创建一个表。

这不会在数据库中生成GUID。@JoePrivett是否希望ID在数据库中唯一,而不是在表级别?对于自动递增列,这确实是非常可能的。您可以为所有ID使用一个表。GUID需要手动滚动,以便在我的数据库集群中是连续的和唯一的。即使您在数据库中有一个表来生成ID,您如何从该表中递增和检索该ID(例如,我使用的是PHP)?在java中,在执行更新后,您有一个方法PreparedStatement.getGeneratedKey。至于PHP和MySQL,请查看文档,在应用程序级别生成GUID不是一个非常糟糕的主意吗?从中心表检索GUID和将GUID添加到SQL语句(应用程序级)之间的时间可能会导致目标表中的GUID序列不同步。