循序渐进丨MogDB / openGauss 如何实现自增主键

概述

自增主键是我们在设计数据库表结构时经常使用的主键生成策略,主键的生成可以完全依赖数据库,无需人为干预,在新增数据的时候,我们只需要将主键的值设置为default,数据库就会为我们自动生成一个主键值。

MySQL 主键自增使用AUTO_INCREMENT关键字,PostgreSQL 自增使用SERIAL关键字或者序列。而 MogDB / openGauss 里兼容两种语法。AUTO_INCREMENT在 MogDB-3.1.0 / openGauss-5.0.0以上适配。

下文会针对 MogDB / openGauss 里几种自增主键的实现进行一个简单的验证。

一、MySQL 的方式(AUTO_INCREMENT)

注意,AUTO_INCREMENT功能,只有在 MogDB / openGauss 的B兼容模式下才可以使用,否则将会有如下提示:

 
 
MogDB=#  SELECT current_database(); 
 current_database 
------------------
 postgres
(1 row)


MogDB=# \l postgres
                                 List of databases
   Name   | Owner | Encoding | Collate | Ctype | Access privileges | Compatibility 
----------+-------+----------+---------+-------+-------------------+---------------
 postgres | om5   | UTF8     | C       | C     |                   | A
(1 row)


MogDB=# CREATE TABLE test_create_autoinc(id bool auto_increment primary key, name varchar(200),a int) auto_increment=1;
ERROR:  auto_increment is supported only in B-format database
MogDB=#

正确的使用方式如下:

 
 
MogDB=# create database db_mysql with dbcompatibility ='B';
CREATE DATABASE
MogDB=# \c db_mysql 
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "db_mysql" as user "om5".
db_mysql=# CREATE TABLE test_create_autoinc_source(id int auto_increment primary key) AUTO_INCREMENT = 100;
NOTICE:  CREATE TABLE will create implicit sequence "test_create_autoinc_source_id_seq" for serial column "test_create_autoinc_source.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_create_autoinc_source_pkey" for table "test_create_autoinc_source"
CREATE TABLE


db_mysql=# \d test_create_autoinc_source
 Table "public.test_create_autoinc_source"
 Column |  Type   |        Modifiers        
--------+---------+-------------------------
 id     | integer | not null AUTO_INCREMENT
Indexes:
    "test_create_autoinc_source_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default




--->插入值进行验证


db_mysql=# INSERT INTO test_create_autoinc_source VALUES(DEFAULT);
INSERT 0 1
db_mysql=# INSERT INTO test_create_autoinc_source VALUES(DEFAULT);
INSERT 0 1
db_mysql=# SELECT id FROM test_create_autoinc_source ORDER BY 1;
 id  
-----
 100
 101
(2 rows)

二、PostgreSQL 的方式(SERIAL)

PostgreSQL(v10以上版本)提供了三种serial类型:smallserial, serial, bigserial,他不是真正的类型,而是在创建唯一标识符列的标志以方便使用。bigserial会创建一个bigint类型的自增;serial用以创建一个int类型的自增;smallserial用以创建一个smallint类型的自增。这几种类型在 MogDB / openGauss 里都是支持的。serial的MAXVALUE=9223372036854775807,起始值为1。自增列的默认值是nextval(‘table_name_seq’::regclass)。

方式一

 
 
MogDB=# create table test_serial_a1(
id serial,
name character varying(256),
constraint pk_test_serial_id primary key( id)
);
NOTICE:  CREATE TABLE will create implicit sequence "test_serial_a1_id_seq" for serial column "test_serial_a1.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "pk_test_serial_id" for table "test_serial_a1"
CREATE TABLE


MogDB=# \d test_serial_a1
                                 Table "public.test_serial_a1"
 Column |          Type          |                          Modifiers                          
--------+------------------------+-------------------------------------------------------------
 id     | integer                | not null default nextval('test_serial_a1_id_seq'::regclass)
 name   | character varying(256) | 
Indexes:
    "pk_test_serial_id" PRIMARY KEY, btree (id) TABLESPACE pg_default


MogDB=# \d test_serial_a1_id_seq
     Sequence "public.test_serial_a1_id_seq"
    Column     |  Type   |         Value         
---------------+---------+-----------------------
 sequence_name | name    | test_serial_a1_id_seq
 last_value    | bigint  | 2
 start_value   | bigint  | 1
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 31
 is_cycled     | boolean | f
 is_called     | boolean | t
 uuid          | bigint  | 0
Owned by: public.test_serial_a1.id


--->插入值进行验证


MogDB=# insert into test_serial_a1 values(DEFAULT,'no1'); 
INSERT 0 1
MogDB=# insert into test_serial_a1 values(DEFAULT,'no1');
INSERT 0 1
MogDB=# SELECT * FROM test_serial_a1;
 id | name 
----+------
  1 | no1
  2 | no1
(2 rows)

方式二

 
 
MogDB=# create table test_serial_a2(
id serial PRIMARY KEY,
name character varying(256)
);
NOTICE:  CREATE TABLE will create implicit sequence "test_serial_a2_id_seq" for serial column "test_serial_a2.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_serial_a2_pkey" for table "test_serial_a2"
CREATE TABLE


MogDB=# \d test_serial_a2
                                 Table "public.test_serial_a2"
 Column |          Type          |                          Modifiers                          
--------+------------------------+-------------------------------------------------------------
 id     | integer                | not null default nextval('test_serial_a2_id_seq'::regclass)
 name   | character varying(256) | 
Indexes:
    "test_serial_a2_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default






--->插入值进行验证


MogDB=# insert into test_serial_a2 values(DEFAULT,'no1');
INSERT 0 1
MogDB=# insert into test_serial_a2 values(DEFAULT,'no1');
INSERT 0 1
MogDB=# SELECT * FROM test_serial_a2;
 id | name 
----+------
  1 | no1
  2 | no1
(2 rows)

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

三、基于序列

基于序列的方式其实和第二种的基于serial的思路一样,一般的主键表,没有使用serial类型,那么我们可以通过创建序列,并在建表的时候指定默认值字段为序列的nextval来实现。

1.手动创建序列

 
 
MogDB=# CREATE SEQUENCE test_aaa_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
CREATE SEQUENCE


MogDB=# \d test_aaa_id_seq
       Sequence "public.test_aaa_id_seq"
    Column     |  Type   |        Value        
---------------+---------+---------------------
 sequence_name | name    | test_aaa_id_seq
 last_value    | bigint  | 1
 start_value   | bigint  | 1
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 0
 is_cycled     | boolean | f
 is_called     | boolean | f
 uuid          | bigint  | 0

2.创建主键表

 
 
MogDB=#  create table test_bbb (
id integer PRIMARY KEY default nextval('test_aaa_id_seq'::regclass),
name character varying(128)
);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_bbb_pkey" for table "test_bbb"
CREATE TABLE
MogDB=# \d test_bbb
                                 Table "public.test_bbb"
 Column |          Type          |                       Modifiers                       
--------+------------------------+-------------------------------------------------------
 id     | integer                | not null default nextval('test_aaa_id_seq'::regclass)
 name   | character varying(128) | 
Indexes:
    "test_bbb_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default




--->插入值进行验证
MogDB=# insert into test_bbb values(DEFAULT,'no1');
INSERT 0 1
MogDB=# insert into test_bbb values(DEFAULT,'no2');
INSERT 0 1
MogDB=# select * from test_bbb;
 id | name 
----+------
  1 | no1
  2 | no2
(2 rows)

也可以创建完表、创建完序列后,使用alter语句,将序列赋值给主键,语句如下所示:

 
 
alter table test_aaa alter column id set default nextval('test_aaa_id_seq');

这种自行使用序列的方法在drop表的时候序列不会随着drop掉。

6c96c0062c0abd03563fe2dd84faa3d9.png

作者简介

/ Author Introduction

阎书利 / 云和恩墨PG技术顾问

PostgreSQL ACE,《快速掌握 PostgreSQL 版本新特性》一书副主编,中国PG分会认证讲师,PGfans 2021年度MVP,Gauss松鼠会2021年度优秀会员,拥有PGCM、OCP(MySQL)等十多项数据库认证。目前主要从事于 PostgreSQL、openGauss / MogDB 的运维以及去O工作。

510e11b7314c39620a3eb02593cdfd10.png

a8bb45d0082b2776ed09c6bcb352a23a.gif

数据驱动,成就未来,云和恩墨,不负所托!


云和恩墨创立于2011年,以“数据驱动,成就未来”为使命,是智能的数据技术提供商。我们致力于将数据技术带给每个行业、每个组织、每个人,构建数据驱动的智能未来。

云和恩墨在数据承载(分布式存储、数据持续保护)、管理(数据库基础软件、数据库云管平台、数据技术服务)、加工(应用开发质量管控、数据模型管控、数字化转型咨询)和应用(数据服务化管理平台、数据智能分析处理、隐私计算)等领域为各个组织提供可信赖的产品、服务和解决方案,围绕用户需求,持续为客户创造价值,激发数据潜能,为成就未来敏捷高效的数字世界而不懈努力。

b07f0db04f895dde11943c99a4afdcc6.gif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于沁恒微 ch643q 多通道采集 adc 驱动层实现

一、代码 #include "main.h"/********************************************************************** fn ADC_Function_Init** brief Initializes ADC collection.** return none*/ void ADC_Function_Init(void) {ADC_InitTypeDef ADC_InitStructure …

【Go 快速入门】协程 | 通道 | select 多路复用 | sync 包

文章目录 前言协程goroutine 调度使用 goroutine 通道无缓冲通道有缓冲通道单向通道 select 多路复用syncsync.WaitGroupsync.Mutexsync.RWMutexsync.Oncesync.Map 项目代码地址:05-GoroutineChannelSync 前言 Go 1.22 版本于不久前推出,更新的新特性可…

LoRa技术在智能气象监测中的应用与解决方案分享

LoRa技术在智能气象监测领域的应用具有广泛的前景,通过LoRa技术可以实现对气象数据的远程采集、传输和监测,为气象行业提供更加智能化和高效的解决方案。以下将探讨LoRa技术在智能气象监测中的应用与解决方案分享。 首先,LoRa技术可以用于连…

python|闲谈2048小游戏和数组的旋转及翻转和转置

目录 2048 生成数组 n阶方阵 方阵旋转 顺时针旋转 逆时针旋转 mxn矩阵 矩阵旋转 测试代码 测试结果 翻转和转置 2048 《2048》是一款比较流行​的数字游戏​,最早于2014年3月20日发行。原版2048由Gabriele Cirulli首先在GitHub上发布,后被移…

【C语言】数据存储篇,内存中的数据存储----C语言整型,浮点数的数据在内存中的存储以及大小端字节序【图文详解】

欢迎来CILMY23的博客喔,本篇为​【C语言】数据存储篇,内存中的数据存储----C语言整型,浮点数的数据在内存中的存储以及大小端字节序【图文详解】,感谢观看,支持的可以给个一键三连,点赞关注收藏。 前言 C语…

GIS之深度学习02:Anaconda2019版本安装(py38)

Anaconda是一个专注于数据科学和机器学习的开源发行版,内置了丰富的工具和库,包括Python解释器、NumPy、SciPy、Pandas、Scikit-learn、TensorFlow等,使用户能够轻松进行科学计算和数据分析。其强大的包管理器conda简化了软件包的安装和环境管…

Linux/Spectra

Enumeration nmap 第一次扫描发现系统对外开放了22,80和3306端口,端口详细信息如下 22端口运行着ssh,80端口还是http,不过不同的是打开了mysql的3306端口 TCP/80 进入首页,点击链接时,提示域名不能解析&…

4核8G服务器并发数多少?性能如何?

腾讯云4核8G服务器支持多少人在线访问?支持25人同时访问。实际上程序效率不同支持人数在线人数不同,公网带宽也是影响4核8G服务器并发数的一大因素,假设公网带宽太小,流量直接卡在入口,4核8G配置的CPU内存也会造成计算…

vue3 增加全局水印(显示登录信息)

一、纯文字水印 在main.ts页面里面 加入以下代码: // 导入 Vue 的 createApp 函数 import { createApp } from vue;// 导入全局样式文件 import ./style.css;// 导入根组件 App.vue import App from ./App.vue;// 导入路由配置 import router from ./router;// 使…

VUE从0到1创建项目及基本路由、页面配置

一、创建项目:(前提已经安装好vue和npm) 目录:E:\personal\project_pro\ windows下,win+R 输入cmd进入命令行: cd E:\personal\project_pro E:# 创建名为test的项目 vue create test# 用上下键选择vue2或vue3,回车确认创建本次选择VUE3 创建好项目后,使用…

【CSS-语法】

CSS-语法 ■ CSS简介■ CSS 实例■ CSS id 和 class选择器■ CSS 样式表■ 外部样式表(External style sheet)■ 内部样式表(Internal style sheet)■ 内联样式(Inline style)■ 多重样式 ■ CSS 文本■ CSS 文本颜色■ CSS 文本的对齐方式■ CSS 文本修饰■ CSS 文本转换■ CS…

2024智慧城市革命:人工智能、场景与运营的融合之力

在数字革命的浪潮中,2024年的智慧城市将成为人类社会进步的新地标。 三大关键元素——人工智能、场景应用和精准运营——正在重新塑造城市面貌,构建未来的智慧城市生活图景。 一、人工智能:赋能智慧城市 随着人工智能技术的快速发展&#x…

第十二篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:深度解读SpeechRecognition语音转文本

传奇开心果系列 系列博文目录Python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、SpeechRecognition语音转文本一般的操作步骤和示例代码二、SpeechRecognition 语音转文本的优势和特点三、易用性深度解读和示例代码四、多引擎支持深度解读和示例代码五、灵活性示…

VL817-Q7 USB3.0 HUB芯片 适用于扩展坞 工控机 显示器

VL817-Q7 USB3.1 GEN1 HUB芯片 VL817-Q7 USB3.1 GEN1 HUB芯片 VIA Lab的VL817是一款现代USB 3.1 Gen 1集线器控制器,具有优化的成本结构和完全符合USB标准3.1 Gen 1规范,包括ecn和2017年1月的合规性测试更新。VL817提供双端口和双端口4端口配置&…

Alist访问主页显示空白解决方法

文章目录 问题记录问题探索和解决网络方案问题探究脚本内容查看 最终解决教程 问题记录 访问Alist主页显示空白,按F12打开开发人员工具 ,选择控制台,报错如下 index.75e31196.js:20 Uncaught TypeError: Cannot assign to read only property __symbo…

我来告诉你,为什么你的第一份工作要去大厂

选择第一份工作,就像是为你的职业生涯设置航向,起点往往决定了你能飞得多高。 为什么说走进大厂是一个明智的决策呢? 简单来说,大厂不仅是一个工作的地方,它是一个成长的加速器,一个能让你的能力和视野快速…

2023年清洁纸品行业分析报告:线上市场销额突破124亿,湿厕纸为重点增长类目

如今,清洁纸品早已经成为人们日常生活的必需品,其市场规模也比较庞大。从销售数据来看,尽管2023年清洁纸品市场整体的销售成绩呈现下滑,但其市场体量仍非常大。 鲸参谋数据显示,2023年京东平台上清洁纸品市场的销量将…

【QT+QGIS跨平台编译】之五十三:【QGIS_CORE跨平台编译】—【qgssqlstatementparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

分享three.js和cannon.js构建Web 3D场景

使用 three.js,您不再需要花哨的游戏PC或控制台来显示逼真的3D图形。 您甚至不需要下载特殊的应用程序。现在每个人都可以使用智能手机和网络浏览器体验令人惊叹的3D应用程序。 这个惊人的库和充满活力的社区是您在浏览器、笔记本电脑、平板电脑或智能手机上创建游…

Flink SQL 中的流式概念:状态算子

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…