自动增量,但忽略列中的现有值

2023-12-08

我有一张桌子:

create table DB.t1 (id  SERIAL,name varchar(255));

并插入一些数据:

insert into DB.t1 (name) values ('name1');
insert into DB.t1 (id,name) values (5,'name2');
insert into DB.t1 (name) values ('name3');
insert into DB.t1 (name) values ('name4');
insert into DB.t1 (name) values ('name5');
insert into DB.t1 (name) values ('name6');
insert into DB.t1 (name) values ('name7');
select * from DB.t1;

然后我可以看到:

1 name1
5 name2
2 name3
3 name4
4 name5
5 name6   -- how to make auto-increment jump over '5'?
6 name7

但 5 出现了两次。如何保持id unique?


更新:稍后,更详细的答案:

  • 让 Postgres 选择下一个最小可用 id

这应该可以顺利进行:

CREATE OR REPLACE FUNCTION f_next_free(_seq regclass)
  RETURNS integer
  LANGUAGE plpgsql AS
$func$
BEGIN
   LOOP
      PERFORM nextval(_seq);
      EXIT WHEN NOT EXISTS (SELECT FROM db.t1 WHERE id = lastval());
   END LOOP; 

   RETURN lastval();
END
$func$;

循环从给定序列中获取下一个数字,直到找到表中尚未存在的数字。甚至应该是可安全同时使用,因为我们仍然依赖于序列。

在默认列中使用此函数serial列(替换串行列的默认值nextval('t1_id_seq'::regclass):

ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);

手册上lastval().

这在很少的岛屿和很多间隙的情况下表现良好(根据示例似乎是这种情况)。到enforce唯一性,添加一个唯一约束(或主键)在列上。

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

自动增量,但忽略列中的现有值 的相关文章

  • 获取两行之间不同的列

    我有一张桌子company有 60 列 目标是创建一个工具来查找 比较和消除该表中的重复项 示例 我发现 2 家公司可能相同 但我需要知道这两行之间哪些值 列 不同才能继续 我认为可以逐列比较 x 60 但我寻找更简单 更通用的解决方案 就
  • MySQL 与 PostgreSQL JSON 搜索功能

    我一直在寻找一篇博客文章或一个功能矩阵 通过 JSON 功能对 MySQL 和 PostgreSQL 进行比较 我找到了一个好的Postgres 的特征矩阵 https www postgresql org about featuremat
  • 与 iexact 一起使用时,Django get_or_create 无法设置字段

    我想用name iexact with get or create尽可能避免用户输入字段的重复 我的提供者模型有一个名称字段 我在其中使用get or create 查找工作正常 但在第一次创建实例时 如下面的 p1 Timber 示例 名
  • 如何在 PostgreSQL 中删除没有任何条件的表中的前几条记录?

    我想无条件地从表中删除前 500 条记录 表定义如下 CREATE TABLE txn log txn log timestamp timestamp without time zone NOT NULL txn log pgm id ch
  • 如何更新表以添加主键并使用递增的 ID 更新所有现有行?

    我导入了一个包含 20 000 行数据的表 但我忘记在其上放置主键 以便每一行都有一个唯一的键 我希望第一行从 ID 1 开始 一直递增到最后一行 最后在 ID 20000 处结束 如何使用单个查询更新所有行 我正在使用MySQL 已尝试使
  • Rails 5 form_for 与复选框数组

    我使用的是 PostgreSQL 数据库和 Rails 5 0 6 我尝试为我工作的学校构建一个课程分配 WebApp 对于每门课程 教师都可以选择允许访问该课程的形式 迁移文件 def up create table courses do
  • 在 Apache Airflow 中实施 Postgres Sql

    我在 Ubuntu 版本 18 04 3 服务器上实现了 Apache Airflow 当我设置它时 我使用了 sql lite 通用数据库 这使用了顺序执行器 我这样做只是为了玩玩并习惯这个系统 现在我正在尝试使用本地执行器 并且需要将我
  • 哪个数据库对复制的支持最好

    我对 MySQL 复制的功能有相当好的感觉 我想知道还有哪些其他数据库支持复制 以及它们与 MySQL 和其他数据库相比如何 我的一些问题是 复制是内置的还是附加组件 插件 复制是如何工作的 高级 MySQL 提供基于语句的复制 5 1 中
  • 窗口函数和 group by 子句如何交互?

    我明白窗函数 http www postgresql org docs 9 2 static tutorial window html and group by http www postgresql org docs 8 0 static
  • 在 postgres 上将表导出为 csv

    如何将表导出到 csv在 Postgres 中 当我不是超级用户并且无法使用copy命令 我仍然可以使用右键单击 导入 按钮将数据导入到 postgres 但没有导出选项 使用 psql 并将流重定向到文件 psql U
  • 为什么以下 Postgres SQL 查询需要这么长时间?

    原始查询如下 SELECT TIME TRADEPRICE FROM YEAR where DATE 2010 03 01 and SECURITY STW AX AND TIME lt 10 16 00 AND TYPE TRADE OR
  • AttributeError:“SQLAlchemy”对象没有属性“模型”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 AttributeError sqlalchemy 对象没有属性 模型 有时会出现 ModuleNotFoundError 没有名
  • 用于存储键值映射的最佳 PostgreSQL 数据类型?

    我想将一个简单的键值字符串映射存储为 PostgreSQL 表中的字段 我打算将地图视为一个整体 即 始终选择整个地图 并且永远不要通过其键或值进行查询 我读过文章比较hstore json and jsonb 但这些并不能帮助我选择哪种数
  • 如何从动态查询中插入具有多列的表?

    如同上一个问题 https stackoverflow com questions 34194889 how to insert into table from dynamic query对于一对一映射 我需要一个针对源和目标中的多个列的解
  • ruby Sequel gem - 如何使用 pg_array 扩展查询数组

    我正在使用pg array http sequel jeremyevans net rdoc plugins files lib sequel extensions pg array rb html扩展和续集版本 4 1 1 我添加了这样的
  • 为什么“setval()”失败并显示“关系...不存在”?

    如果您尝试设置这样的序列号 SELECT setval table ID seq SELECT max ID 1 FROM table 您可能会遇到以下错误 ERROR relation table ID seq does not exis
  • 在 Sequelize 中添加带有起始值的自动递增整数

    经过一些研究 我似乎无法找到执行以下操作的好方法 我不想向现有表添加新列 该列应该是一个自动递增整数 从值 1000 开始 我的迁移文件现在简单明了 use strict module exports up queryInterface S
  • 为什么 justify_interval('360 days'::interval) 结果 '1 年'

    因为某些原因justify interval now 2013 02 14 timestamptz 产生奇怪的结果 postgres select justify interval concat 365 4 1 days interval
  • Postgres Notify 不适用于逻辑复制

    我正在使用逻辑复制将数据从 Postgres 10 4 复制到另一个 Postgres 10 4 实例 订阅者有多个触发器将事件记录到单个表中 该表有一个触发器 该触发器执行另一个函数 返回触发器 来为下游侦听器调用 NOTIFY 审计表上
  • psycopg 错误,列不存在

    我不断收到这个 错误 psycopg2 ProgrammingError 列 someentry 不存在 该错误表明该列someentry不存在时someentry不是列 它只是要输入数据库的值 这是给出错误的代码 cur execute

随机推荐