AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 122623
Accepted
Basil Bourque
Basil Bourque
Asked: 2015-12-02 17:33:25 +0800 CST2015-12-02 17:33:25 +0800 CST 2015-12-02 17:33:25 +0800 CST

Postgres 中 UUID 列的默认值

  • 772

在Postgres 9.x 中,对于 type 的列UUID,如何指定要自动生成的 UUID 作为任何行插入的默认值?

postgresql default-value
  • 3 3 个回答
  • 186300 Views

3 个回答

  • Voted
  1. Best Answer
    Basil Bourque
    2015-12-02T17:33:25+08:002015-12-02T17:33:25+08:00

    tl;博士

    DEFAULT在定义列以调用 OSSP uuid 函数之一时调用。每次插入一行时,Postgres 服务器都会自动调用该函数。

    CREATE TABLE tbl 
    (
      pkey UUID NOT NULL DEFAULT uuid_generate_v1() , 
      CONSTRAINT pkey_tbl PRIMARY KEY ( pkey )
    )
    

    如果您已经使用pgcrypto扩展,请考虑bpieck 的答案。

    生成 UUID 所需的插件

    虽然Postgres开箱即用支持以原生128 位形式存储 UUID(通用唯一标识符)值,但生成UUID 值需要插件。在 Postgres 中,插件称为.extension

    要安装扩展程序,请调用CREATE EXTENSION。为避免重新安装,请添加IF NOT EXISTS. 有关更多详细信息,请参阅我的博客文章,或在 StackOverflow 中查看此页面。

    我们想要的扩展是一个用 C 语言构建的开源库,用于处理 UUID,OSSP uuid。这个 Postgres 库的构建通常与 Postgres 的安装捆绑在一起,例如Enterprise DB提供的图形安装程序,或Amazon RDS for PostgreSQL等云提供商包含的图形安装程序。

    CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
    

    生成各种 UUID

    请参阅扩展程序的文档以查看提供用于生成各种 UUID 值的多个命令的列表。要获取由计算机的MAC 地址加上当前日期时间加上一个小的随机值构建的 UUID 的原始版本,请调用uuid_generate_v1().

    SELECT uuid_generate_v1();
    

    672124b6-9894-11e5-be38-001d42e813fe

    这个主题的后来变体是为替代类型的 UUID 开发的。有些人可能不想记录服务器的实际 MAC 地址,例如出于安全或隐私考虑。Postgres 扩展生成五种 UUID,外加“nil” UUID 00000000-0000-0000-0000-000000000000。

    UUID 作为默认值

    该方法调用可以自动为任何新插入的行生成默认值。定义列时,请指定:

    DEFAULT uuid_generate_v1()

    请参阅以下示例表定义中使用的命令。

    CREATE TABLE public.pet_
    (
      species_ text NOT NULL,
      name_ text NOT NULL,
      date_of_birth_ text NOT NULL,
      uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(),  -- <====
      CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE public.pet_
      OWNER TO postgres;
    

    UUID 版本

    uuid-ossp插件可以生成各种版本的UUID 。

    • uuid_generate_v1()
      包含当前计算机的MAC 地址+ 当前时刻。常用,但如果您对披露数据库服务器的 MAC 或生成此值的时间敏感,请避免使用。由规范定义为版本 1 UUID。
    • uuid_generate_v1mc()
      与版本 1类似,但使用随机多播 MAC 地址而不是真实 MAC 地址。显然是一种使用版本 1 的方法,但如果您对披露该事实很敏感,请替换另一个 MAC 而不是数据库服务器的实际 MAC。
      什么是“随机多播 MAC”?我不知道确切。在阅读了RFC 4122的第 4.1.6 节之后,我怀疑这是一个用于代替 MAC 的随机数,但其位设置为指示多播 MAC 地址而不是通常的单播,以便将版本 1 的这种变体与通常的真实 MAC 版本 1 UUID。
    • uuid_generate_v3( namespace uuid, name text )
      包含您提供的文本的MD5 哈希值。由规范定义为版本 3 UUID,基于命名空间的 UUID。
    • uuid_generate_v4()
      基于 128 位中的 121-122 位随机生成的数据。六位或七位用于指示版本和变体。这种 UUID 仅在使用加密强的随机生成器实现时才实用。由规范定义为版本 4 UUID。
    • uuid_generate_v5( namespace uuid, name text )
      与版本 3 相同,但使用SHA1散列。由规范定义为版本 5 UUID。
    • uuid_nil()
      一种特殊情况,所有位都设置为零00000000-0000-0000-0000-000000000000。用作未知 UUID 值的标志。称为nil UUID。

    要比较类型,请参阅问题,要使用哪个 UUID 版本?

    如果您只对版本 4(随机生成)感兴趣,并且已经在使用pgcrypto,请参阅 bpieck 的答案。

    如果您对版本 3 和 5 感到好奇,请参阅此问题,生成 v5 UUID。什么是名称和命名空间?.

    有关更多讨论,请参阅我对类似问题的回答和我的博客文章UUID 值从 JDBC 到 Postgres。

    • 159
  2. bpieck
    2018-11-22T08:20:24+08:002018-11-22T08:20:24+08:00

    pgcrypto扩展

    只是对 Basil 非常详细的答案的一个小补充。

    由于目前大多数人都在使用pgcrypto,uuid_generate_v4()因此您可以使用gen_random_uuid()版本4 UUID值来代替。

    首先,在 Postgres 中启用pgcrypto。

    CREATE EXTENSION "pgcrypto";
    

    只需将列的 DEFAULT 设置为

    DEFAULT gen_random_uuid()
    
    • 23
  3. Lukas Liesis
    2022-08-09T00:17:51+08:002022-08-09T00:17:51+08:00

    如果使用 Postgres 14 或更新版本,您不需要任何修改或额外插件,只需使用gen_random_uuid()

    刚刚在使用 Postgres v14 的默认 AWS Aurora Serverless v2 上进行了测试

    ps 你可以看到我的默认 id 实际上是带前缀wor-的,而它是工作区 id。我为所有表添加前缀,因此当我从任何地方获取 ID 时 - 日志、支持等。我可以准确地知道要搜索的内容。

    concat('wor-', gen_random_uuid())

    在此处输入图像描述

    在此处输入图像描述

    • 4

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve