当前位置: 首页 > article >正文

PostgreSQL 中Identity Columns生成一个唯一的标识符

在 PostgreSQL 中,从版本 10 开始引入了“身份列”(Identity Columns)的概念,这是一种简化和标准化主键生成的方式,类似于其他数据库系统(如 SQL Server)中的 IDENTITY 属性。身份列允许数据库自动为表中的每一行生成一个唯一的标识符,通常用于主键字段。

使用身份列

要在 PostgreSQL 中创建一个带有身份列的表,你可以使用 GENERATED ALWAYS AS IDENTITY 子句。这里有一个简单的例子:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,  -- SERIAL 是一种简化的方式,等同于使用 IDENTITY
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
);

或者,更明确地使用 IDENTITY 关键字:

To create an identity column, use the GENERATED ALWAYS AS IDENTITY clause in CREATE TABLE

CREATE TABLE users (
    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
);

To create an identity column, use the GENERATED BY DEFAULT AS IDENTITY clause in CREATE TABLE

CREATE TABLE users (
    id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
);

在这个例子中,id 列被设置为身份列,这意味着每当向 users 表中插入一行新数据时,id 列的值会自动递增。

superdb=# insert into users(username,email) values('A001','SZ');
INSERT 0 1
superdb=# insert into users(username,email) values('A002','GZ');
INSERT 0 1
superdb=# select * from users;
 id | username | email
----+----------+-------
  1 | A001     | SZ
  2 | A002     | GZ
(2 rows)

-- 指定关键字DEFAULT代替值以显式请求序列生成的值

superdb=# insert into users(id,username,email) values(DEFAULT,'A003','BJ');
INSERT 0 1
superdb=# select * from users;
 id | username | email
----+----------+-------
  1 | A001     | SZ
  2 | A002     | GZ
  3 | A003     | BJ
(3 rows)

自定义序列

默认情况下,身份列使用默认的序列生成器,但你也可以指定一个自定义的序列:

CREATE SEQUENCE custom_seq START WITH 1000 INCREMENT BY 1;

CREATE TABLE users (
    id INT GENERATED ALWAYS AS IDENTITY (SEQUENCE = custom_seq) PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
);

在这个例子中,id 列将使用 custom_seq 序列来生成值,从 1000 开始,每次递增 1。

注意事项

  1. 兼容性:虽然 SERIAL 类型在 PostgreSQL 中已经存在很长时间了,并且它实际上也是基于序列的自动递增列,但 IDENTITY 提供了更标准和灵活的语法。

  2. 事务回滚:如果在一个事务中插入了行但由于某种原因事务被回滚,那么这些行生成的序列值将不会被重用。这意味着序列值可能会有间隙。

  3. 性能:对于大多数应用来说,使用身份列的性能是非常好的。然而,在高并发环境下,可能需要考虑序列的性能调优。

  4. 手动插入:虽然身份列通常用于自动生成值,但你也可以手动插入值。如果尝试插入一个已经存在的值,将会导致一个唯一性约束错误。

  5. 迁移:如果你正在从旧版本的 PostgreSQL 迁移到支持身份列的新版本,你可能需要更新你的表定义以使用 IDENTITY 属性。

通过使用身份列,PostgreSQL 提供了一种简洁而强大的方式来管理主键和其他需要唯一标识符的列。


http://www.kler.cn/a/416575.html

相关文章:

  • LeetCode题练习与总结:最小基因变化--433
  • Vue:使用 KeepAlive 缓存切换掉的 component
  • PKO-LSSVM-Adaboost班翠鸟优化最小二乘支持向量机结合AdaBoost分类模型
  • 0基础学前端系列 -- 深入理解 HTML 布局
  • 2024年一级建造师考试成绩,即将公布!
  • docker服务容器化
  • Grafana插件安装并接入zabbix数据源
  • 速盾高防cdn支持移动端独立缓存
  • 基于 LlamaFactory 的 LoRA 微调模型支持 vllm 批量推理的实现
  • Go语言技巧:快速统一字符串中的换行符,解决跨平台问题
  • T507 buildroot linux4.9之RTC8563开发调试
  • SQLModel与FastAPI结合:构建用户增删改查接口
  • 海盗王用golang重写的AccountServer功能
  • Facebook Audience Network优化指南
  • 学习笔记042——如何通过IDEA中自带的数据库组件导出MySQL数据
  • Jmeter测试工具的安装和使用,mac版本,jmeter版本5.2.1
  • 《向量数据库指南》——稀疏激活:解锁大数据处理新纪元
  • 【游戏引擎之路】登神长阶(十五)——DirectX12龙书:行百里者半九十(学习阶段完结)
  • 介绍一下atoi(arr);(c基础)
  • 汽车驾校寒冬,新增无人机飞手培训技术详解
  • GPT打字机效果—— fetchEventSouce进行sse流式请求
  • Oracle LinuxR7安装Oracle 12.2 RAC集群实施(DNS解析)
  • 【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数
  • 使用Java来构筑一个基础的项目完全梳理(二):前端vue搭建
  • SpringBoot小知识(3):热部署知识
  • LLM - 使用 LLaMA-Factory 微调 Qwen2-VL DPO(LoRA) 图像数据集 教程 (3)