为什么在 PostgreSQL 中,当你删除表中的一行时,未来插入的行的 id 号不是连续的?

2023-12-15

我创建下表

CREATE TABLE dogs (
  id serial,
  name VARCHAR(15),
  age integer;

我的桌子看起来像这样

                                  Table "public.birds"
 Column  |         Type          |                     Modifiers                      
---------+-----------------------+-------------------------------------    
 id      | integer               | not null default nextval('birds_id_seq'::regclass)
 name    | character varying(25) | 
 age     | integer               | 

我插入两行

INSERT INTO dogs (name, age) 
VALUES ('puffy', 13),
 ('fluffy', 15);

表格现在看起来像这样

  id |  name  | age 
 ----+--------+-----
   1 | puffy  |  13
   2 | fluffy |  15
 (2 rows)

然后我删除 id = 2 的行

DELETE FROM dogs WHERE id = 2;

并添加另一行

INSERT INTO dogs (name, age) VALUES('mimi', 20);

该表是

  id | name  | age 
 ----+-------+-----
   1 | puffy |  13
   3 | mimi  |  20
 (2 rows)

我的问题是为什么第二行中 id 的下一个数字不是 2 而是 3?我猜想在某些东西下面的某个地方存储了内存中的最后一个值,并且具有该 id 的行被删除并不重要。我知道如果需要的话我可以显式插入 id 值。但我想弄清楚为什么会发生这种情况。 是什么功能或特性造成了这种情况?它是如何工作的?


PostgreSQL 不努力跟踪已删除的序列 ID。它只是使用一个计数器来获取下一个要生成的 ID。

如果您生成值然后回滚事务、客户端连接在提交之前崩溃或服务器崩溃,也会出现间隙。

您可以依赖生成的 ID 的唯一属性是唯一性。您甚至不能依赖它们按照生成的顺序出现在表中,因为提交顺序不一定与 ID 分配顺序相同。

如果您需要无缝序列,有多种方法可以实现它们,但它们在并发写入负载中的性能很差。这就是 PostgreSQL 这样做的原因。

有关更多信息,请 Google“gaplessequence postgresql”并阅读有关序列和“nextval”函数的文档章节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 PostgreSQL 中,当你删除表中的一行时,未来插入的行的 id 号不是连续的? 的相关文章

随机推荐

  • 在 Python 中使用空格有什么陷阱吗?

    目前 我在 Python 中从未遇到过空格问题 尽管我只在两个项目中使用过它 而且我是唯一的程序员 对于学习 Python 的人来说 Python 中的空格和缩进有哪些潜在的陷阱 在某些编辑器中 一行用空格缩进 而下一行用制表符缩进 这可能
  • 如何根据动态字段对 solr 结果进行排序

    我需要根据动态字段对结果进行排序 我怎样才能做到这一点 当我对其中一些动态属性的最小值进行排序时 它没有给出正确的结果 因为我的查询就像 sort min A 160018 A chandigarh1 一些文档同时具有这两个字段A 1600
  • python 从 tsv 文件链接一个列表

    我有这个 tsv 文件 其中包含一些链接路径 每个链接由 分隔我想用 在下面的示例中 我们可以看到文件中的文本是分开的 我只想通读最后一列 这是一条以 14th 开头的路径 6a3701d319fc3754 1297740409 166 1
  • 如何从 PHP 文本中删除空行?

    我需要在 PHP 中删除空白行 带有空格或绝对空白 我使用这个正则表达式 但它不起作用 str ereg replace t r n str str preg replace t r n str 我想要的结果是 blahblah blahb
  • 如何在 Android 4.2 中以编程方式卸载 USB 驱动器

    我读过很多关于这个主题的文章 但我还没有找到解决方案 在我的应用程序中 我需要在将文件从 USB 驱动器复制到平板电脑后卸载 USB 驱动器 这样我就可以安全地删除它 而无需使用 设置 菜单 现在我正在使用这个方法 Utility copy
  • 如何通过ARC确保IOS 5中单例的销毁?

    比如说 我想创建一个里面有一些数据的单例 正如在单例中所期望的那样 数据仅动态分配一次 但我现在想知道何时以及如何发布这些数据 我应该建立特殊的方法来破坏单例吗 更具体地说 何时执行该单例的 dealloc 方法 谁对此负责 您可以声明显式
  • 尝试通过php执行python命令但权限错误

    我上传了一个图像文件并将其从临时文件夹复制到 var www 内的文件夹 然后 尝试通过 php 执行 python 命令 其中exec 命令采用以下格式 exec python file py FILES file name 即使执行以下
  • 如何从spark连接到远程hive服务器[重复]

    这个问题在这里已经有答案了 我在本地运行 Spark 想要访问位于远程 Hadoop 集群中的 Hive 表 我可以通过在 SPARK HOME 下启动 beeline 来访问配置单元表 ml master spark 2 0 0 bin
  • R,绘图,多个绘图图形中字体大小的变化

    我正在为出版物创建图表 并希望它们具有相同的字体大小 当我创建一个图形时多块地块 the 字体变小即使我没有改变tiff 分辨率或pointsize范围 我根据最终适合的绘图数量增加了图形大小 并确保单个和多个绘图图形的边距相等 以下是示例
  • 在 linq 中,为什么 IEnumerable.Intersect 的后续调用要快得多

    在看这个问题的时候C 两个数组的相似之处人们注意到 最初的 linq 调用比后续调用慢得多 缓存的是什么造成了如此大的差异 我感兴趣的是我们何时可以实现这种类型的行为 也许这只是因为一遍又一遍地使用相同的列表 static void Mai
  • 谷歌图表中垂直轴静态的水平滚动

    我在用google chart在我的应用程序中 我想实现滚动 我可以通过设置容器 div 的样式来做到这一点 但问题是它会随着轴滚动整个图表 如何仅水平滚动图表区域并保持垂直轴静态 可视化 API 有一个内置控件来处理图表滚动 图表范围过滤
  • jQuery - 通过 AJAX 提交表单并将结果页面放入 div...?

    我正在使用 jQuery 表单 http jquery malsup com form 将数据发送到表单 有没有办法可以在不刷新的情况下将表单生成的结果页面放入页面上的 div 中 任何建议表示赞赏 我会建议not使用该表单插件 它是在没有
  • 角度中的不安全链接

    在 AngularJS 中 在以下场景中 Firefox 将unsafe 在按以下方式生成的 url 前面 然后它会显示一个错误页面 指出 地址无法理解 这是我本地 PC 上的文件请求 Link li a href fruit title
  • 在同一台服务器上运行 Vue.js 和 Laravel(同一端口)

    我正在开发一个网站 使用 Laravel 作为后端 Vue js 2 作为前端 现在每次我想运行我的网站时我都必须使用两个命令 php artisan serve 这将在端口 8000 上运行 laravel 服务器 npm run dev
  • Matlab:矩阵中每一行的Argmax和点积

    我有2个矩阵 X in R n m and W in R k m where k lt
  • NGINX 未将调用从 React 应用程序路由到后端应用程序

    我有一个 AWS Ubuntu 服务器 它托管在 127 0 0 1 4100 运行的 React 前端 并使用端口 127 0 0 1 1323 对 Go 应用程序进行 api 调用 我安装了 Nginx 并为这两个端口设置了代理通行证
  • 当我尝试添加外部 Jars 时,转换为 dalvik 格式失败

    我使用 Zend Studio 7 2 作为我的主要 IDE 我开发 Android 应用程序 我想使用 html 解析器 但是添加外部 jar 我总是遇到同样的问题转换为 dalvik 格式失败而且eclipse需要很多时间来构建工作区
  • 在 WLP 8.5.5.8 上运行的 JAX-RS 应用程序中发布 JSON 时引发异常

    我有一个非常简单的使用 JAX RS 的 Java 应用程序 在 WLP 8 5 5 8 上运行 当我发布复合结构的 JSON 时 出现此错误 ERROR 错误处理时发生错误 放弃 无效类型 的价值 类型 java util LinkedH
  • 我们能否知道 WPF 上的用户或代码是否已关闭窗口?

    我有一个在我的应用程序上显示的窗口控件 有时 窗口由用户关闭 单击 X 按钮 有时由代码自动关闭 我正在监听 Closed 事件 也尝试过 Closing 并且想知道我是哪种情况 用户或代码 这可能吗 我知道this问题但确实没有令人满意的
  • 为什么在 PostgreSQL 中,当你删除表中的一行时,未来插入的行的 id 号不是连续的?

    我创建下表 CREATE TABLE dogs id serial name VARCHAR 15 age integer 我的桌子看起来像这样 Table public birds Column Type Modifiers id int