【发布时间】:2013-11-28 11:40:26
【问题描述】:
Here 和 here 是一些与此类似的问题,但不太相同,我可以将它们应用于我的解决方案。
我需要使用单个查询在文档中删除一行并重新编号行(从删除的行开始)。 我得到一个答案here,它不在单个查询中,因此不适合简单使用。
这是我的示例表,其中包含所有文档的所有行。
工作文件将是编号为 2 的“brkalk”。
例如,我们将删除第 'brred' 行 3。
DROP TABLE IF EXISTS kalksad1;
CREATE TABLE kalksad1(
kalk_id int PRIMARY KEY,
brkalk integer,
brred integer,
description text);
INSERT INTO kalksad1 VALUES
(12, 2, 5, 'text index 12 doc 2 row 5'),
(26, 2, 1, 'text index 26 doc 2 row 1'),
(30, 2, 2, 'text index 30 doc 2 row 2'),
(32, 4, 1, 'text index 32 doc 4 row 1'),
(36, 1, 1, 'text index 36 doc 1 row 1'),
(37, 1, 2, 'text index 37 doc 1 row 2'),
(38, 5, 1, 'text index 38 doc 5 row 1'),
(39, 5, 2, 'text index 39 doc 5 row 2'),
(42, 2, 3, 'text index 42 doc 2 row 3'),
(43, 2, 4, 'text index 43 doc 2 row 4'),
(46, 3, 1, 'text index 46 doc 3 row 1'),
(47, 3, 2, 'text index 47 doc 3 row 2');
当然我可以用 SQL 轻松删除一行:
DELETE FROM kalksad1 WHERE brkalk=2 AND brred=3
但是为了我的程序的良好功能,需要在一个文档内的行编号中没有“漏洞”。
删除后,“brred”列中的行编号为 1、2、4、5。
我想在删除第 3 行后立即对第 4 行和第 3 行和第 5 到 4 行重新编号(实际上是在“brred”列中重新编号),如果可能的话,在单个 SQL 命令中进行查询,以便我可以将其应用于所有我的文档并为此类删除创建函数。
因为像swap and renumber 这样更复杂的事情是可能的,我认为也有可能。
如果有人可以开发描述的查询,请。
【问题讨论】:
-
不可能在一条 SQL 语句中做你想做的事。但这可能在单个事务或存储过程中是可能的。但是,通常,这种要求表明您需要重新设计表格。 (另外,您需要对 {brkalk, brred} 的唯一约束吗?)
-
嗨,迈克,我不知道我是否说得好“单一 SQL 语句”,但我给出了我们之前解决的示例,哪些是功能性的(交换和重新编号)所以我想“单一事务”会没事。不幸的是,现在我无法重新设计表格。由于客户端程序这样做,因此不需要关注唯一约束。只是为了重新编号文档“brkalk”中的“brred”列。
标签: postgresql