赞
踩
作者:瀚高PG实验室 (Highgo PG Lab)-波罗
1.UUID概述
数据类型uuid存储由RFC 4122、ISO/IEC 9834-8:2005以及相关标准定义的通用唯一标识符(UUID)(某些系统将这种数据类型引用为全局唯一标识符GUID)。
这种标识符是一个128位的量,它由一个精心选择的算法产生,该算法能保证在已知空间中任何其他使用相同算法的人能够产生同一个标识符的可能性非常非常小。
因此,对于分布式系统,这些标识符相比序列生成器而言提供了一种很好的唯一性保障,序列生成器只能在一个数据库中保证唯一。
一个UUID被写成一个小写十六进制位的序列,该序列被连字符分隔成多个组:
首先是一个8位组,接下来是三个4位组,最后是一个12位组。总共的32位(十六进制位)表示了128个二进制位。
一个标准形式的UUID类似于:
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
PostgreSQL也接受另一种输入形式: 使用大写位、标准格式被花括号包围、忽略某些或者全部连字符、在任意4位组后面增加一个连字符。
例如:
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
输出总是采用标准形式。
PostgreSQL为UUID提供了存储和比较函数,但是核心数据库不包含任何用于产生UUID的函数,因为没有一个单一算法能够很好地适应每一个应用。
uuid-ossp模块提供了实现一些标准算法的函数。
pgcrypto模块也为随机 UUID 提供了一个生成函数。 此外,UUID可以由客户端应用产生,或者由通过服务器端函数调用的其他库生成。
2. UUID的使用
方法一:
使用create extension命令
create extension "uuid-ossp";
安装扩展成功以后,就可以通过uuid_generate_v4()或uuid_generate_v1()查询
示例如下:
[highgo@hgdb01 ~]$ psql
psql (4.1.1)
PSQL: Release 4.1.1
Connected to:
HighGo Database V4.1 Enterprise Edition Release 4.1.1 - 64-bit Production
Type "help" for help.
highgo=# create extension "uuid-ossp";
CREATE EXTENSION
highgo=# \dx
List of installed extensions
Name | Version | Schema | Description
-----------+---------+------------+-------------------------------------------------
highgo_x | 9.5.7 | pg_catalog | Make it fly
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
uuid-ossp | 1.0 | public | generate universally unique identifiers (UUIDs)
(3 rows)
highgo=# select uuid_generate_v4();
uuid_generate_v4
--------------------------------------
229f38c6-7d4c-47cc-a15a-b304099bf506
(1 row)
方法二:如果不想安装插件,也可以参考下面的function方式生成一个指定长度的id。
create or replace function random_string(integer)returns text as
$body$
select array_to_string(array(select substring('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' FROM (ceil(random()*62))::int FOR 1) FROM generate_series(1, $1)), '');
$body$
language sql volatile;
示例:
highgo=# create or replace function random_string(integer)returns text as
highgo-# $body$
highgo$# select array_to_string(array(select substring('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' FROM (ceil(random()*62))::int FOR 1) FROM generate_series(1, $1)), '');
highgo$# $body$
highgo-# language sql volatile;
CREATE FUNCTION
highgo=# select random_string(16);
random_string
------------------
HbPM9ApoJjmj2i2x
(1 row)
highgo=# select random_string(32);
random_string
----------------------------------
TANE5gwz1pR00qKHRjeatTPDCCwEvzCP
(1 row)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。