PostGres的UUID SHORT()函数

4

你好,我有一个基于MYSQL开发的项目,考虑由于商业软件许可证成本的原因转移到PostGres。

在我的MYSQL中,我有多个表格,我依赖于UUID_SHORT()函数作为这些表格的主键。请参阅链接:Mysql UUID_SHORT Info

PostGres是否有类似UUID_SHORT函数的功能? 我正在寻找一个唯一的ID,而不是一个序列。同时,类似UUID_SHORT基于系统时间的函数也会很棒。此外,下面是我在PHP中使用的类函数,当我想要获取用于MYSQL主键插入的唯一ID时使用。

非常感谢您的任何意见,因为这将是转移到PostGres的主要原因。

function getUniqueId(){
        //return unique id

        $temp_id = strval(uniqid());
        $temp = $this->conn->prepare('CREATE TEMPORARY TABLE tempId (temp_id VARCHAR(30) PRIMARY KEY, id BIGINT UNSIGNED)');
        $temp->execute();
        $temp = $this->conn->prepare('INSERT INTO tempId(temp_id, id) VALUES(:temp_id, UUID_SHORT())');
        $temp->bindParam(':temp_id', $temp_id, PDO::PARAM_STR);
        $temp->execute(); 
        $temp = $this->conn->prepare('SELECT id FROM tempId WHERE temp_id = :temp_id ');
        $temp->bindParam(':temp_id', $temp_id, PDO::PARAM_STR);
        $temp->execute(); 
        $tempResult= $temp->fetchAll(PDO::FETCH_ASSOC);
        $temp = $this->conn->prepare('DROP TEMPORARY TABLE tempId');
        $temp->execute();
        $temp_id = $tempResult[0]['id'];     
        return $temp_id;
    }

2
我听说过很多改变的理由,但从来没有听说过那个理由 :p - Drew
1
许可证费用?MySQL没有任何费用。 - Bohemian
Postgres是一个更全面的数据库,它具有本地UUID列类型。只需使用完整大小的UUID。使用这种突变的非标准“短”版本可能不值得麻烦。 - tadman
1
@Bohemian 这可能是关于使用商业许可捆绑MySQL与付费应用程序的问题。您可以在软件即服务平台上免费使用MySQL作为后端,但如果将其作为设备的一部分进行发货,则可能需要商业许可。不过,在支付任何费用之前,我建议先咨询律师。 - tadman
嘿,我承认人们经常滥用它们,而且它们很难维护,但是如果这个生成短UUID的过程被一致地使用,并且将来不太可能改变,那么存储过程比每个标识符四个语句更整洁和可预测。 - tadman
显示剩余4条评论
1个回答

9

PostgreSQL有一个扩展名为"uuid-ossp"的扩展,其中包含4种算法,每种算法都实现了官方UUID算法之一,第四种算法是随机生成122位(剩余的6位标识其为版本4 UUID)的UUID。所有这些算法返回一个16字节的UUID值。

(请注意,根据定义,64位值根本不是UUID。您提供的MySQL参考文献已经解释了这一点:只有在不违反一组规则的情况下才能保证唯一性。也许他们应该称其为“LUID”,因为它绝对不是全局唯一的。这种微调(采用定义好的标准并加以改变)就像微软的邪恶味道。但我跑题了。)

在PostgreSQL中:

CREATE EXTENSION "uuid-ossp";

安装扩展后,您可以使用uuid数据类型:
CREATE TABLE my_table (
    id    uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
    ...
END;

然后,您可以一次在表中插入一行并检索主键:
INSERT INTO my_table (...) VALUES (...)
RETURNING id;

上述语句将返回一个16字节的二进制值作为uuid值,不确定在PHP中如何管理它。
您还可以仅生成uuid值而无需插入行:
SELECT uuid_generate_v4();

太棒了,正是我想要的。 - Ka Tech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接