如何获得一列包含连续且递增的数字,且不丢失任何数字?

2023-11-23

可能的重复:
如何在 PostgreSQL 查询中显示行号?
在 Postgresql 中使用标识符重新排序列
使用带有子选择的更新进行 PostgreSQL 记录重新排序

我只是问在 PostgreSQL 中是否存在这样的可能性:如果我有 5 行并且一列中有数字1, 2, 3, 4, 5如果我删除第三行,那么这些列中不是主键,postgreSQL 会重新枚举该列,这样我就可以1, 2, 3, 4代替1, 2, 4, 5?


改编自之前的答案。当应用程序需要一个跳位顺序对于变量(读取:EAV 模型中的记录),它也可以是备用键(的一部分)。

  • the priority字段需要保持连续。 [这是跳位顺序]
  • INSERT 时:优先级 >= 新记录的所有记录的优先级应增加
  • 类似地:在 DELETE 上 -> 递减
  • 如果记录的优先级因更新而改变,则旧优先级值和新优先级值之间的记录的优先级应向上或向下移动。
  • to avoid recursive trigger invocation:
    • 基于触发器的更新翻转flipflag他们接触的任何记录。
    • 他们测试old.flipflag=new.flipflag检测real更新。 (非触发因素引起的)

        -- Make some data
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;

CREATE TABLE fruits
        ( id INTEGER NOT NULL PRIMARY KEY
        , priority INTEGER NOT NULL
        , flipflag boolean NOT NULL default false
        , zname varchar NOT NULL
        , CONSTRAINT unique_priority UNIQUE (priority) DEFERRABLE INITIALLY DEFERRED
        );
INSERT INTO fruits(id,zname,priority) VALUES
 (1  , 'Pear' ,4)
,(2  , 'Apple' ,2)
,(3  , 'Orange' ,1)
,(4  , 'Banana' ,3)
,(5  , 'Peach' ,5)
        ;

        -- Trigger functions for Insert/update/delete
CREATE function shift_priority()
RETURNS TRIGGER AS $body$

BEGIN
        UPDATE fruits fr
        SET priority = priority +1
        , flipflag = NOT flipflag       -- alternating bit protocol ;-)
        WHERE NEW.priority < OLD.priority
        AND OLD.flipflag = NEW.flipflag -- redundant condition
        AND fr.priority >= NEW.priority
        AND fr.priority < OLD.priority
        AND fr.id <> NEW.id             -- exlude the initiating row
                ;
        UPDATE fruits fr
        SET priority = priority -1
        , flipflag = NOT flipflag
        WHERE NEW.priority > OLD.priority
        AND OLD.flipflag = NEW.flipflag
        AND fr.priority <= NEW.priority
        AND fr.priority > OLD.priority
        AND fr.id <> NEW.id
        ;
        RETURN NEW;
END;

$body$
language plpgsql;

CREATE function shift_down_priority()
RETURNS TRIGGER AS $body$

BEGIN

        UPDATE fruits fr
        SET priority = priority -1
        , flipflag = NOT flipflag       -- alternating bit protocol ;-)
        WHERE fr.priority > OLD.priority
                ;
        RETURN NEW;
END;

$body$
language plpgsql;

CREATE function shift_up_priority()
RETURNS TRIGGER AS $body$

BEGIN
        UPDATE fruits fr
        SET priority = priority +1
        , flipflag = NOT flipflag       -- alternating bit protocol ;-)
        WHERE fr.priority >= NEW.priority
                ;
        RETURN NEW;
END;

$body$
language plpgsql;

        -- Triggers for Insert/Update/Delete
CREATE TRIGGER shift_priority_u
        AFTER UPDATE OF priority ON fruits
        FOR EACH ROW
        WHEN (OLD.flipflag = NEW.flipflag AND OLD.priority <> NEW.priority)
        EXECUTE PROCEDURE shift_priority()
        ;
CREATE TRIGGER shift_priority_d
        AFTER DELETE ON fruits
        FOR EACH ROW
        EXECUTE PROCEDURE shift_down_priority()
        ;
CREATE TRIGGER shift_priority_i
        BEFORE INSERT ON fruits
        FOR EACH ROW
        EXECUTE PROCEDURE shift_up_priority()
        ;

        -- Do some I/U/D operations
\echo Pears are Okay
UPDATE fruits
SET priority = 1
WHERE id=1; -- 1,4

SELECT * FROM fruits ORDER BY priority;

\echo dont want bananas
DELETE FROM fruits WHERE id = 4;
SELECT * FROM fruits ORDER BY priority;

\echo  We want Kiwis
INSERT INTO fruits(id,zname,priority) VALUES (4  , 'Kiwi' ,3) ;
SELECT * FROM fruits ORDER BY priority;

Result:

Pears are Okay
UPDATE 1
 id | priority | flipflag | zname  
----+----------+----------+--------
  1 |        1 | f        | Pear
  3 |        2 | t        | Orange
  2 |        3 | t        | Apple
  4 |        4 | t        | Banana
  5 |        5 | f        | Peach
(5 rows)

dont want bananas
DELETE 1
 id | priority | flipflag | zname  
----+----------+----------+--------
  1 |        1 | f        | Pear
  3 |        2 | t        | Orange
  2 |        3 | t        | Apple
  5 |        4 | t        | Peach
(4 rows)

We want Kiwis
INSERT 0 1
 id | priority | flipflag | zname  
----+----------+----------+--------
  1 |        1 | f        | Pear
  3 |        2 | t        | Orange
  4 |        3 | f        | Kiwi
  2 |        4 | f        | Apple
  5 |        5 | f        | Peach
(5 rows)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获得一列包含连续且递增的数字,且不丢失任何数字? 的相关文章

  • Postgresql - 确定从级联删除中删除哪些记录

    我继承了一个相当大的 postgresql 数据库 我们有一个每月运行的作业 用于备份现有数据库并使用我们收到的更新的供应商数据创建一个新数据库 目前有一个小问题 在不深入了解表设置 数据建模内容等细节的情况下 我相信它可以通过简单的删除查
  • 在 Postgres 9.0+ 中使用 PL/pgSQL 循环表

    我想循环遍历所有表以计算每个表中的行数 以下查询给我一个错误 DO DECLARE tables CURSOR FOR SELECT tablename FROM pg tables WHERE tablename NOT LIKE pg
  • 通过 Python 在 PostgreSQL 中的 unicode 字符串中是否允许空字节?

    unicode 字符串中是否允许空字节 我不问 utf8 我的意思是 unicode 字符串的高级对象表示 背景 我们通过 Python 在 PostgreSQL 中存储包含空字节的 unicode 字符串 如果我们再次读取字符串 字符串会
  • 是否可以从转储中覆盖数据库记录?

    我有一个 PostgreSQL 数据库的转储 它是用命令创建的 pg dump database name gt dumpname sql 我想从这个转储中恢复数据库 但我收到很多错误 已经存在 是否可以从转储中覆盖现有数据库记录 我必须恢
  • 加入多对多关系

    我有三个表 applications permissions 和 applications permissions applications applications permissions permissions id lt applic
  • Postgres如何从外部服务器传输所有枚举

    我有两个数据库 我希望能够在它们之间传输数据 因此我想将一个大型模式从一个数据库导入到另一个数据库 其中有枚举的分配 所以我遇到了这里描述的问题SQL 创建具有枚举列的外部表时出错 https stackoverflow com quest
  • 交易已在触发条件下结束。批次已中止。派生属性

    我有这个触发器 CREATE trigger dbo DeriveTheAge on dbo Student after insert update as begin declare sid as int declare sdate as
  • 返回动态列集

    我创建了以下函数来根据该函数的参数返回列集 CREATE OR REPLACE FUNCTION getColumns IN column1 text IN column2 text IN column3 text IN column4 t
  • 从两个不同的表中减去值

    考虑表X A 1 2 3 3 6 考虑表 Y A 0 4 2 1 9 如何编写一个查询来获取这两个表之间的差异 以计算下表 例如表 Z A 1 2 1 2 3 目前尚不清楚你想要什么 会是这个吗 SELECT SELECT SUM A FR
  • 在 Postgresql 中使用标识符重新排序列

    以下代码可以工作并创建一个带有序列号的临时表 该表会为每个新名称重新启动 with results as select row number over partition by name order BY name as mytid nam
  • 使用 pyspark 连接 PostgreSQL

    我正在尝试使用 pyspark 连接到数据库 并且使用以下代码 sqlctx SQLContext sc df sqlctx load url jdbc postgresql hostname database dbtable SELECT
  • 无法在 Google Cloud Function 中加载 node_modules(index.js,不在项目根目录上)

    因此 我需要部署 Google Cloud Function 以在 PostgreSQL 数据库 Cloud SQL 上发出选择请求 我需要使用 pg 模块 然后使用以下命令安装它 npm i pg 你需要知道我的项目目录是这样的 proj
  • Postgres 重叠数组中的一列

    我有一个表 A 其中有一列 col1 其中每个记录都是整数数组 col1 1 2 3 4 1 2 6 7 1 2 3 8 9 我喜欢有一行作为结果 其中包含 col1 中所有数组的重叠或相交 select overlap col1 from
  • 在 Postgres 中以周为单位分割间隔

    这是另一个关于日期的 SQL 问题 我正在使用 PHP 和 Postgres 构建一个日历应用程序 它将显示几天 几周甚至几个月的事件 每个事件都有开始日期和结束日期 按范围选择它们不是问题 然而 如果 Postgres 可以在每周的第一天
  • 尝试解码 JSON 日期时显示“JSON 写入中的类型无效 (__NSTaggedDate)”

    当我尝试从具有日期变量的数据库中解码 JSON 对象时 出现错误 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 JSON 写入中的无效类型 NSTaggedDate 错误发生在以下代码行 le
  • 在 Docker Compose 中更改 postgres 容器服务器端口

    我正在尝试使用 Docker compose 在远程服务器上部署第二个数据库容器 该 postgresql 服务器在端口 5433 上运行 而不是第一个 postgresql 容器使用的端口 5432 当我设置应用程序时 我收到以下错误输出
  • 如何优化 postgres 查询

    我正在运行以下查询 SELECT fat FROM Table1 fat LEFT JOIN modo captura mc ON mc id fat modo captura id INNER JOIN loja lj ON lj id
  • Azure PostgreSQL 时间点还原不起作用

    我们在 Azure 中有一个 Postgre 数据库 但遇到了一个问题 表中的所有行都被删除 我们尝试使用 de azure 门户中的 时间点还原 选项 但创建的数据库与当前运行的数据库具有相同的数据 我们还尝试了其他日期和时间 数据库问题
  • Python 和 Postgresql:操作错误:fe_sendauth:未提供密码

    我知道 StackOverflow 上有很多类似的问题 但我已经阅读并重新阅读了它们 但我似乎无法解决我的特定问题 我正在开发一个使用 Peewee 和 Psycopg2 访问 PostGresQL 数据库的 Python 应用程序 这一切
  • 如果数组重叠,则折叠多行数组

    我在 PostgreSQL 9 3 中有一个表 其中包含一个列 每行包含一个数组 我正在努力寻找崩溃的方法 共享相同元素的数组行 Examples 简单重叠 给定以下两行数组 1 2 3 5 3 6 9 结果将是一行包含 5 1 2 3 6

随机推荐

  • 如何重写此 Flask 视图函数以遵循 post/redirect/get 模式?

    我有一个小型日志浏览器 它根据用户的输入检索并显示以前记录的记录列表 它不更新任何内容 代码非常简单并且运行良好 这是一个简化版本 app route log methods GET POST def log form LogForm if
  • 如何在 Docker 构建期间运行需要 tty 的命令?

    我有一些需要在 Docker 构建期间运行的脚本 该脚本需要 tty Docker 在构建期间不提供 在幕后该脚本使用read命令 Witha tty 我可以做类似的事情 echo yes echo no myscript sh 没有它 我
  • 地图/方向卡和集成操作/意图,例如呼叫、电子邮件 - 使用 Dialogflow、Actions on Google、NodeJS 客户端 V2

    我一直在试图弄清楚如何使用构建地图 方向卡对话流和NodeJS 客户端 经过一些研究后 我发现了这个SO解释了如何使用生成静态地图 URL 作为图像 谷歌路线 API和折线 但在我看来 Dialogflow 中应该有一个功能 允许开发人员构
  • 将方法设为虚拟有什么危险?

    我一直在使用 RhinoMocks 进行一些模拟 它要求将模拟方法设为虚拟 这很好 除了我们有一个自定义框架 其中包含我想要模拟的方法 这些方法当前未标记为虚拟 我无法预见使这些方法虚拟化会出现任何问题 但我想知道使方法虚拟化有哪些我应该注
  • 如何在 CSS 中创建脉冲发光环动画?

    我喜欢这样的方式website让他们的戒指发光并发出脉冲 我想知道他们是如何做到的 我可以做类似的东西 但我不是很好 这就是我所能弄清楚的 但它似乎不起作用 CSS glowycircleouter blue glow4 box shado
  • 切换到浏览器中其他打开的选项卡时更改标题标签的内容

    我最近在两个不同的网站上看到了这个 有人知道它是如何完成的吗 如果您打开了多个选项卡 并且保留了当前选项卡 则选项卡中的标题会发生更改 非常好的技巧 http blog invisionapp com http zerosixthird s
  • 使用 jQuery datepicker 进行自定义日期格式验证(无法摆脱美国日期验证)

    我快到了 我创建了本地化的 jQuery 日期选择器 添加了自定义格式验证 但无法摆脱 默认 美国日期格式验证 我正在像这样渲染我的日期字段 Html EditorFor m gt m JobDate Html ValidationMess
  • Rails - 嵌套包含在活动记录上?

    我有一个我获取的事件列表 我试图包含与此事件关联的每个用户以及与每个用户关联的每个配置文件 用户被包含在内 但他们的个人资料未被包含在内 我该怎么做 Event includes users profile 文档似乎不清楚 http gui
  • Laravel 5 如何包含 autoload.php

    我试图包含 autoload php 的路径 该路径位于 vendor autoload php 尝试访问它的文件位于 public this file php 我将路径设置为require once vendor autoload php
  • Resteasy Bean 验证未被调用

    问题背景 我有一个通过 Resteasy 使用 Spring 的 Resteasy 服务SpringContextLoaderListener 这是基于 Resteasy 版本构建的3 0 beta 6 我想对传入请求使用 bean 验证
  • Azure DevOps 本地成本

    这么问似乎很奇怪 但这就是微软希望我们做的事情 所以这里 我正在考虑设置本地 Azure DevOps 2019 服务器 但与往常一样 许可和成本不是很透明 我们的开发团队可能会获得 Visual Studio Pro 订阅 我相信它附带
  • 每 5 秒连续调用一次 Javascript 函数 [重复]

    这个问题在这里已经有答案了 可能的重复 每 60 秒调用一次函数 我想每 5 秒连续调用一次 Javascript 函数 我见过 setTimeOut 事件 如果我想要连续使用它会正常工作吗 您可以使用setInterval 参数是相同的
  • 如何用某种颜色突出显示树视图所选项目?

    我在 WPF 中有一个树视图 当我选择树视图项目时 我想要不同的颜色 简单触发TreeView ItemContainerStyle对于默认的 TreeView 模板没有帮助 对于标准模板突出显示是通过特定的背景更改来完成的TreeView
  • jQuery 可以解析存储在变量中的 HTML 吗?

    我使用 PHP 和 ajax 命令来获取外部网页的整个 HTML 内容 通过 PHPfile get contents 命令 并将该 HTML 传递到 JavaScript 变量中 一旦我将页面的 HTML 内容存储在变量中 我是否可以使用
  • 计算旋转矩形中最大的内接矩形

    我试图找到计算可包含在旋转矩形内的最大 面积 矩形的最佳方法 有些图片应该有助于 我希望 理解我的意思 输入矩形的宽度和高度是给定的 旋转角度也是给定的 输出矩形未旋转或倾斜 我正在走一条冗长的路线 我什至不确定它是否能处理极端情况 没有双
  • 模仿 Photoshop 混合效果,如乘法、叠加等

    我正在制作一个带有整页背景图像的网站 我想为侧栏创建一个背景图像 其作用类似于具有乘法作为混合模式的 Photoshop 图层 它只是一个具有 Photoshop 多层 行为 的蓝色表面 无法合并叠加层和图像 因为以其他屏幕比例 尺寸打开网
  • d3js 创建具有固定节点的力布局[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我已经实现了这个http jsbin com omokap 3 edit 但是 我想取消图形的动态行为 例如在拖尾状态下 但这仅适用于单个节点 并将节点放置在从 json 获取的设置点
  • 使用 JPA 2 配置持久性和 orm

    我在 jBPM 项目中使用 Persistence 时遇到一些问题 我的配置是 jBPM 5 4 Hibernate JPA 2 我目前正在设置流程以通过 persistence xml 连接到具有持久性的数据库 我只是尝试将默认数据源 在
  • 在 SQL 中仅获取每天的多个条目中的最后一行

    我有一张桌子 类似于 Id Name EnteredOn Percentage 01 person1 2011 03 09 17 29 35 683 56 29 02 person1 2011 03 09 17 29 35 731 76 2
  • 如何获得一列包含连续且递增的数字,且不丢失任何数字?

    可能的重复 如何在 PostgreSQL 查询中显示行号 在 Postgresql 中使用标识符重新排序列 使用带有子选择的更新进行 PostgreSQL 记录重新排序 我只是问在 PostgreSQL 中是否存在这样的可能性 如果我有 5