Postgresql数据类型之UUID

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)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑头人

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值