PostGres的UUID SHORT()

时间:2016-09-12 04:00:04

标签: mysql postgresql

您好我有一个基于MYSQL的开发,并考虑到由于商业软件的许可成本而转移到PostGres。

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

PostGres是否具有与UUID_SHORT功能类似的功能?我正在寻找一个uniqiue 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;
    }

1 个答案:

答案 0 :(得分:4)

PostgreSQL有一个extension called "uuid-ossp",有4个算法,每个算法实现一个官方UUID算法,其中第四个是122位随机(其余6位将其识别为版本4 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;

上面的语句将uuid值作为16字节的二进制值返回,不确定如何在PHP中管理它。

您也可以在不插入行的情况下生成uuid值:

SELECT uuid_generate_v4();