百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

【PostgreSQL】自增主键的问题与扩展

toyiye 2024-06-21 12:23 10 浏览 0 评论

对于主键,作为开发者在学生时代就要学习,进入职场,开始充斥各种类型的主键,有.net系的GUID做主键,也有java系的用uuid,当然这俩基本就是一回事,然后还有了雪花id,自增id做主键,以及现在常用的自增id做主键,雪花id做逻辑主键,这都是常用的主键实践方案,我们在这里不讨论孰优孰劣,因为就算分出个高下,也不能改变的存量系统的现状。本篇我们来讨论一下自增主键,尤其是在PostgreSQL下的自增主键的问题。这个问题首先就要从不同数据库的差异讲起。

1.Oracle

多年以前,在一家公司使用的数据库是Oracle数据库,发现与.net程序员认知的数据库(sqlserver)也是有差异的:设置自增主键,Oracle需要创建序列,如何创建?有兴趣的可以去百度,这里就不浪费篇幅了,毕竟以后还会再使用oracle数据库机会近乎等于0。大概就是需要创建一个序列,这个序列有一个初始值,有个步长,每select一次,当前值就往前累加一个步长,oracle中,数据表每次insert 都会默认从序列中select序列一个值。然后实现了自增。

2.sqlserver和mysql

没用过oracle的童鞋应该马上就发现了在熟知的数据库操作的不同:我们在sqlservermysql是没这样的操作,前者可以直接指定主键为标识,也有一个标识种子和标识增量的设置,有orm框架时(比如ef什么的),在做migrate迁移时,也会自动创建。另外就是mysql也是只需要指定auto_increment

3.PostgreSQL

终于说到本篇的主角了,为什么是主角,因为这是目前工作使用频率最高的数据库。博主曾一度以为PostgreSQLmysql这种数据库应该是差不了多少的,自增主键自然也不需要那么麻烦,由于工作是公司自研的ORM框架,也自带了Migrate功能,平时开发也是有点像.net以前热炒的概念code first,然后再执行迁移,也屏蔽了创建数据库的这块细节,让博主产生了这样的误解,使用数据库管理工具发现,自增主键的实现依然依赖了序列( 当然,博主认为mysqlsqlserver底层也是有维护这样的一个序列 )。最近由于线上功能排序问题,应急修改了自增主键的值,它并不像sqlserver那样会直接抛错:

当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'Db' 中的标识列插入显式值。

只要没有任何索引限制,pg都会允许更改。但是这样真的没问题吗?有问题,但是不大。

会有问题,问题在于如果修改的值已经大于序列的当前值,新增到下一行时,自增id的值刚好等于这个修改的值,就会违反某个索引约束,比如唯一索引,顺理成章的就会抛索引约束的错误。

为什么问题又不大呢?因为,序列的特点:每select一次,序列值就增加一次,新增下一列第一次失败,select了一次,再新增一次,就正常了。除非-------序列当前值的后面的一长串的id值都被占用了,那就从业务功能上操作上看,一直点新增,好像一直在抛错,相当不友好。怎么办?跟当年oracle一样:

# 1.先查看当前数据中自增id的最大值(max)
SELECT max(f_id) FROM table_name

# 2.检查当前表的序列值
select nextval('t_xxx_f_id_seq') # 这个值<max(f_id)

# 3.修改序列的初始值
alter sequence t_xxx_f_id_seq restart with [max(f_id)+1] # 比当前自增id最大值大1即可

4.问题扩展-索引名称

既然我们已经聊到了数据之间确实存在差异,我们就像摆龙门阵一样,到哪儿哪儿,讲一讲索引名称在mysqlpgsql之间的差异吧。当个笔记,这些差异虽然可以通过各种migrate工具抹平,但是底层却是实打实差异。

  • 创建索引的时候,MySQL 只要同表中索引名称唯一即可
  • PostgreSQL 必须整个库唯一

好了,就这么个问题,就捎带手记录一下,至于其他延展内容,请大家自行学习。

相关推荐

今日精选5篇教程:用Python3带你从小白入门机器学习实战教程手册

正文1:教程标题:英伟达SuperSloMoGithub项目开放作者:英伟达教程摘要:今年6月份,英伟达发布了一份生成高质量慢动作视频的论文——《SuperSloMo:HighQual...

电子书 | 笨办法学 Python 3(笨办法学python3pdf)

本周更新了5本IT电子书资源,同时站内已经有12本Python入门方面的相关电子书,可供新手选择。1、笨办法学Python3本书是一本Python入门书,适合对计算机了解不多,没有...

Python2 已终结,入手Python 3,你需要这30个技巧

选自medium作者:Erik-JanvanBaaren机器之心编译参与:王子嘉、一鸣Python2在今年和我们说拜拜了,Python3有哪些有趣而又实用的技巧呢?这篇教程有30个你会喜欢...

Python 3 系列教程(python3.9基础教程)

Python的3.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python3.0在设计的时候没有考...

Python第三课3. Python 的非正式介绍

3.Python的非正式介绍?在下面的例子中,通过提示符(>>>与...)的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每...

如何使用 Python 构建一个“谷歌搜索”系统?| 内附代码

来源|hackernoon编译|武明利,责编|Carol出品|AI科技大本营(ID:rgznai100)在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统。基本上,这...

Python 模拟微博登陆,亲测有效!(如何用python爬微博)

今天想做一个微博爬个人页面的工具,满足一些不可告人的秘密。那么首先就要做那件必做之事!模拟登陆……代码是参考了:https://www.douban.com/note/201767245/,我对代码进...

Python 驱动的 AI 艺术批量创作: 免费的Bing 绘图代码解析

这篇文章将深入分析一段Python代码,该代码利用Bing的AI绘图功能,即bing的images/create,根据用户提供的文本提示生成图像。我们将详细探讨其工作原理、代码结构、...

Python爬虫Scrapy库的使用入门?(python scrapy爬虫)

Scrapy是一个开源的并且支持高度可扩展的Python爬虫框架,主要被用来实现从网站提取数据。出现之初就是为网页抓取而设计,但是现在它也可以被用于从APIs中抓取数据或通用的Web抓取任务。Sc...

Python3 标准库概览(python标准库有什么)

操作系统接口os模块提供了不少与操作系统相关联的函数。>>>importos>>>os.getcwd()#返回当前的工作目录'C:\\Python34...

零基础入门学习Python(三):变量和字符串

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。今天小编为大家带来的是...

Python读写docx文件(python读写word)

Python读写docx文件Python读写word文档有现成的库可以处理pipinstallpython-docx安装一下。https://python-docx.readthedocs.io/...

如何利用Xpath抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

如何利用Xpath选择器抓取京东网商品信息

前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~HTML文件其实就是由一组尖括号构成的标...

python之Scrapy爬虫案例:豆瓣(python爬虫书籍豆瓣评分)

python模块之Scrapy爬虫框架...

取消回复欢迎 发表评论:

请填写验证码