【发布时间】:2015-12-17 12:18:35
【问题描述】:
在 PostgreSQL (9.3) 中,我有一个表定义为:
CREATE TABLE charts
( recid serial NOT NULL,
groupid text NOT NULL,
chart_number integer NOT NULL,
"timestamp" timestamp without time zone NOT NULL DEFAULT now(),
modified timestamp without time zone NOT NULL DEFAULT now(),
donotsee boolean,
CONSTRAINT pk_charts PRIMARY KEY (recid),
CONSTRAINT chart_groupid UNIQUE (groupid),
CONSTRAINT charts_ichart_key UNIQUE (chart_number)
);
CREATE TRIGGER update_modified
BEFORE UPDATE ON charts
FOR EACH ROW EXECUTE PROCEDURE update_modified();
我想将 chart_number 替换为如下序列:
CREATE SEQUENCE charts_chartnumber_seq START 16047;
这样通过触发器或函数,添加新的图表记录会自动按升序生成新的图表编号。但是,现有的图表记录不能更改其图表编号,并且多年来在分配的图表编号中存在跳过。因此,在为新图表记录分配新图表编号之前,我需要确保尚未使用“新”图表编号,并且没有为任何具有图表编号的图表记录分配不同的编号。
如何做到这一点?
【问题讨论】:
-
序列中的间隙无需担心。并且序列永远不会两次生成相同的数字(除非您手动弄乱它)
-
@a_horse_with_no_name 是的...但是随着时间的推移,我想填补序列中的空白,以便使用中的图表编号是连续的。 :) 谢谢。
-
recid是serial,但chart_number不是?序列charts_chartnumber_seq存在这一事实本身并没有任何意义。assigning a new chart number to a new chart record..我们在谈论INSERT吗? -
@Erwin Brandstetter 是的...我想在表格中插入一个新的图表记录,并让它自动分配一个未使用的图表编号。图表编号应来自序列中的间隙,直到使用完所有“间隙”编号。之后,简单的 nextval 将是正确的。
标签: postgresql sequence gaps-and-islands