PostgreSQL如何设置主键自增(序列、SERIAL)

news2024/11/17 9:38:41

文章目录

  • PostgreSQL如何设置主键自增
    • 背景
    • 什么是序列
    • Postgresql的自增机制
    • 基本使用
      • 使用SERIAL或BIGSERIAL数据类型
      • 手动创建序列和设置默认值
      • 实战demo:PostgreSQL 手动序列管理
        • 设置序列的当前值
    • 工作常用总结
      • 创建表时候自定义序列:id SERIAL PRIMARY KEY 和 id int8 NOT NULL DEFAULT nextval(...) 的主要区别
      • id SERIAL PRIMARY KEY 和 id int8 NOT NULL DEFAULT nextval(...) 的主要区别

PostgreSQL如何设置主键自增

背景

在使用Mysql时,创建表结构时可以通过关键字auto_increment来指定主键是否自增。但在Postgresql数据库中,虽然可以实现字段的自增,但从本质上来说却并不支持Mysql那样的自增。

在MySQL当中,我们可以通过勾选来实现ID自增,我们的navcat如下图所示:
在这里插入图片描述

pgsql没有auto_increment这么一说,所以想要建立自增主键就得想想其他办法了!

什么是序列

序列是 PostgreSQL 中的一种特殊对象,用于生成唯一的数字值,通常用于表的主键字段。序列保证了在并发插入时,生成的 ID 唯一且自增。

Postgresql的自增机制

在PostgreSQL中,实现表中的id列作为主键并设置为自增,通常涉及到使用序列(SEQUENCE)和设置默认值的概念。

方式1:
使用SERIALBIGSERIAL数据类型是最简便的方式,它们会自动创建序列并设置默认值。

使用SERIAL或BIGSERIAL数据类型时,PostgreSQL会自动为我们创建一个序列并将它设为对应字段的默认值,这能极大简化开发过程。

例如,当我们希望id字段自增时,只需在建表时将id字段的类型指定为SERIAL(对于较小的整数)或BIGSERIAL(对于较大的整数),无需手动创建序列或编写额外的代码来管理主键的增长。

方式2:
使用CREATE SEQUENCEALTER TABLE命令手动创建序列并设置默认值。

基本使用

使用SERIAL或BIGSERIAL数据类型

Postgresql中字段的自增是通过序列来实现的。
Postgresql提供了三种serial数据类型:smallserial,serial,bigserial。它们与真正的类型有所区别,在创建表结构时会先创建一个序列,并将序列赋值给使用的字段。
这些属性类似于 MySQL 数据库支持的 AUTO_INCREMENT 属性。

PostgreSQL的SERIAL不是真正的数据类型,而是在创建表时的一个快捷方式,用于自动创建支持自增的序列。

如果尚未创建表,可用如下方法

方法一:

create table test_a (

  id serial,
  name character varying(128),
  constraint pk_test_a_id primary key( id)
);

方法二:

create table test_b(

  id serial PRIMARY KEY,
  name character varying(128)
); 

这两种方法,会自动创建名为表名_字段名_seq的序列,且MAXVALUE=9223372036854775807

这两种方法用的是pg的serial类型实现自增,drop表的时候指定的序列也会drop掉。

这种使用方式,每次向表中插入新记录时,id列将自动增长,无需手动指定id值。

手动创建序列和设置默认值

先创建主键表

create table test_c (

  id integer PRIMARY KEY,
  name character varying(128)
);  

使用CREATE SEQUENCE命令创建一个序列。例如:

CREATE SEQUENCE test_c_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

将序列赋值给主键
创建序列后,需要通过ALTER TABLE命令来显式设置某列的默认值为该序列的下一个值:

alter table test_c alter column id set default nextval('test_c_id_seq');

这种方法在drop表的时候序列不会随着drop掉,这种方式,seq是一个独立的东西,插入语句,不能忽略id字段。

实战demo:PostgreSQL 手动序列管理

  1. 删除序列
DROP SEQUENCE IF EXISTS xxx_seq;
  • DROP SEQUENCE: 删除指定的序列。
  • IF EXISTS: 如果序列不存在,则不会抛出错误,而是安全地跳过此操作。
  • xxx_seq: 指定要删除的序列。
  1. 创建序列
    创建序列是生成唯一数字值的重要步骤。以下是创建序列的 SQL 示例。
CREATE SEQUENCE xxx_seq
INCREMENT 1
MINVALUE  1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
  • CREATE SEQUENCE: 创建一个新的序列。
  • INCREMENT 1: 每次调用 nextval 时,序列的值增加 1。
  • MINVALUE 1: 序列的最小值为 1。
  • MAXVALUE 9223372036854775807: 序列的最大值,设置为 64 位整数的最大值。
  • START 1: 序列的初始值为 1。
  • CACHE 1: 指定缓存的序列值数量,可以提高性能。设置为 1 意味着每次只缓存一个值。
  1. 使用序列
    一旦序列创建完成,您可以使用 nextval 函数获取下一个值,并将其插入到表中。
INSERT INTO t_test (id, name)
VALUES (nextval('xxx_seq'), 'admin2');

nextval: 调用序列的下一个值。
将序列值作为 id 插入到 t_test 表中,确保每条记录的 ID 唯一。

  1. 查看序列信息
    您可以查询系统视图以查看序列的当前状态。
SELECT * FROM xxx_seq;

说明
此查询将返回序列的当前值、增量、最小值和最大值等信息。

设置序列的当前值
SELECT setval('xxx_seq', 1, false);
  • setval 是 PostgreSQL 提供的一个函数,用于设置序列的当前值。
  • xxx_seq 是一个标识符,表示您要操作的序列。
  • 1, 这是要设置的值。此语句将序列的当前值设置为 1。
  • false 这是一个布尔参数,指示下次调用 nextval 时序列的行为:
    • false: 表示下次调用 nextval 时,序列将返回 2(即在设置的值上加 1)。
    • true: 如果设置为 true,则下次调用 nextval 时将返回 1(即从设置的值开始)。

这条语句的效果是将序列 xxx_seq 的当前值设置为 1,并且在下次获取下一个值时,序列将返回 2。这通常用于重置序列,以确保新的 ID 从特定值开始,常见于数据清理或重新插入数据的场景。

工作常用总结

创建表时候自定义序列:id SERIAL PRIMARY KEY 和 id int8 NOT NULL DEFAULT nextval(…) 的主要区别

  • SERIAL:
    SERIAL 是一种 PostgreSQL 特定的数据类型,它实际上是一个简写,用于创建一个整型列并同时创建一个序列。
    当使用 SERIAL 时,PostgreSQL 会自动为该列创建一个序列,并将该列的默认值设置为调用该序列的 nextval 函数。
    例如,id SERIAL PRIMARY KEY 会隐式执行下面的操作:
id int4 NOT NULL DEFAULT nextval('some_seq');
  • int8 NOT NULL DEFAULT nextval(…):
    种方式更显式地定义了列的类型和默认值。
    您可以选择使用 int8(64 位整数),并手动指定要使用的序列名称和行为。
    这种方式更加灵活,允许开发者在表定义中自定义序列的名称和特性。
    通过显式定义序列,您可以在多个表之间共享同一个序列,确保 ID 的唯一性,同时在需要时也能灵活地调整序列的行为。这种方式提供了更大的控制力,适用于复杂的数据库设计需求。

id SERIAL PRIMARY KEY 和 id int8 NOT NULL DEFAULT nextval(…) 的主要区别

  • 使用 SERIAL:

适合简单场景,快速定义自增主键。
可能不够灵活,无法自定义序列的行为或名称。

  • 使用 int8 和 nextval(…):

提供更大的控制和灵活性。
可以指定不同的序列名,允许在多个表中使用同一个序列,或者在需要时替换序列。

总结:如果只需要简单的自增 ID,使用 SERIAL 更为简洁。如果需要更大的灵活性和控制,尤其是在管理序列时,使用 int8 NOT NULL DEFAULT nextval(…) 是更好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

调用具体接口的所有实现类

Java获取接口的所有实现类方法-CSDN博客https://blog.csdn.net/feeltouch/article/details/135399078

最实用接地气的 .NET 微服务框架

目录 前言 项目介绍 快速入门 1、服务注册 2、启动UI 3、服务发现与调用 4、启动服务网关 项目地址 最后 前言 微服务架构已经成为搭建高效、可扩展系统的关键技术之一,然而,现有许多微服务框架往往过于复杂,使得我们普通开发者难以…

基于生成对抗模型GAN蒸馏的方法FAKD及其在EdgesSRGAN中的应用

文章目录 FAKD系列论文paper1: FAKD:用于高效图像超分辨率的特征亲和知识蒸馏(2020)ABSTRACT1. INTRODUCTION2. PROPOSED METHOD2.1. Feature Affinity-based Distillation (FAKD) 2.2. Overall Loss Function3. EXPERIMENTAL RESULTS3.1. Ex…

TypeSript9 命名空间namesapce

我们在工作中无法避免全局变量造成的污染,TypeScript提供了namespace 避免这个问题出现 内部模块,主要用于组织代码,避免命名冲突。命名空间内的类默认私有通过 export 暴露通过 namespace 关键字定义 TypeScript与ECMAScript 2015一样&…

React学习day02-React事件绑定、组件、useState、React组件样式处理方式

3、React事件绑定(以点击事件为例) (1)语法(整体遵循驼峰命名法):on事件名称{事件处理程序} 比如:点击事件onClick(类似于vue中的click) (2&…

成为Python高手,我能给出的最好建议

今天笔者将向大家分享5个良好的Python编程习惯,大牛认证,通过不断实践,助你写出更Pythonic的代码,让你向Python大师之路更进一步。 今天笔者将向大家分享5个良好的Python编程习惯,大牛认证,通过不断实践&a…

Java面试题精选:消息队列(二)

一、Kafka的特性 1.消息持久化:消息存储在磁盘,所以消息不会丢失 2.高吞吐量:可以轻松实现单机百万级别的并发 3.扩展性:扩展性强,还是动态扩展 4.多客户端支持:支持多种语言(Java、C、C、GO、…

WPF中如何根据数据类型使用不同的数据模板

我们在将一个数据集合绑定到列表控件时,有时候想根据不同的数据类型,显示为不同的效果。 例如将一个文件夹集合绑定到ListBox时,系统文件夹和普通文件夹分别显示为不同的效果,就可以使用模板选择器功能。 WPF提供了一个模板选择…

查找4(散列表)

1)基本概念 、 2)散列函数的构造 3)解决冲突 I)开放地址发 II)链地址法 4)散列表的查找

vs2022 C++ 使用MySQL Connector/C++访问mysql数据库

1、下载MySQL Connector/C,我这里下载的是debug版本,下载链接MySQL :: Download MySQL Connector/C (Archived Versions) 2、解压并且放到MySQL文件夹中,便于使用 3、打开vs2022,右键项目,点击属性 4、在 “C/C” ->…

el-input中show-password密码提示功能去掉

el-input中show-password密码提示功能去掉 一、效果图二、封装个组件三、如何使用 一、效果图 二、封装个组件 <template><divclass"el-password el-input":class"[size ? el-input-- size : , { is-disabled: disabled }]"><inputclass…

Java线上监控诊断产品Arthas(续集)

Java线上监控诊断产品Arthas&#xff08;续集&#xff09; 前言1.auth指令2.monitor指令解读 3.classloader指令场景 4.dump指令场景 5.getstatic指令场景 6.heapdump指令场景 7.profiler指令场景 8.sc指令场景 9.trace指令场景 前言 在去年&#xff0c;我发表了一片文章&…

心血管内科常用评估量表汇总,附操作步骤与评定标准

心血管内科常用量表来评估患者病情、预测风险&#xff0c;量表在制定治疗方案和预测疾病进展等方面发挥着重要作用。常笑医学整理了6个心血管内科常用的评估量表&#xff0c;支持下载和在线使用&#xff0c;供临床医护人员参考。 01 GRACE缺血风险评估 &#xff08;完整量表请点…

Qt 学习第7天:Qt核心特性

元对象系统Meta-object system 来自AI生成&#xff1a; Qt中的元对象系统&#xff08;Meta-Object System&#xff09;是Qt框架的一个核心特性&#xff0c;它为Qt提供了一种在运行时处理对象和类型信息的能力。元对象系统主要基于以下几个关键概念&#xff1a; 1. QObject&a…

【91-136】行为型模式

目录 一.模板方法模式 1.1 概述 1.2 结构 1.3 案例 1.4 优缺点 1.5 使用场景 二.策略模式 2.1 概述 2.2 结构 2.3 案例 2.4 优缺点 2.5 使用场景 2.6 JDK 源码解析 三.命令模式 3.1 概述 3.2 结构 3.3 案例 3.4 优缺点 3.5 使用场景 四.责任链模式 4.1 概…

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 翻译

NeRF&#xff1a;将场景表示为用于视图合成的神经辐射场 引言。我们提出了一种方法&#xff0c;该方法通过使用稀疏的输入视图集优化底层连续体场景函数来实现用于合成复杂场景的新视图的最新结果。我们的算法使用全连通&#xff08;非卷积&#xff09;深度网络来表示场景&…

设计模式(一):七大原则

*设计模式的目的* 编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好 1) 代码重用性 (即:相同功能的代码,不用多次编写) 2) 可读性 (即:编程规范性, 便于其他程序员的阅读和理…

【C++ 第十七章】封装 unordered_map / unordered_set

声明&#xff1a;上一章讲解了 哈希结构的原理与实现&#xff0c;本章主要将上一章学过的拉链法的哈希结构封装进 unordered_map / unordered_set&#xff0c;所以需要先学过相关知识&#xff0c;才能更好吸收本章知识 上一章的链接&#xff1a;【C 第十六章】哈希 1. unorder…

Ubuntu24.04 安装向日葵远程访问工具

目录 安装向日葵远程访问工具 解决方案&#xff1a; 1.下载软件包 2.远程Ubuntu桌面控制卡住 卸载向日葵远程访问工具 安装向日葵远程访问工具 安装命令&#xff1a;sudo dpkg -i 文件名.deb sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 提示错误如下&#xf…

后端修改资源后重新运行项目了,浏览器刷新资源没更新问题

修改后重启项目&#xff0c;去浏览器刷新&#xff1a; 没有改变&#xff1f; 解决办法&#xff1a; F12去调试器里“网络”工具栏下找到“禁用缓存”按钮即可解决