更改序列的起始值 - Postgresql

40

我在串行方面遇到了一些问题:从一个文件中,我填写了我的数据库,在其中有一个客户ID(它是一个序列号,也是我的主键)。我有300个客户,因此有300个客户ID(从1到300)。现在我的问题是,我有一个新客户的表单,但我无法添加它们,因为当我添加一个客户时,我的程序会添加具有ID 1的客户,或者ID 1已经分配给另一个客户。

那么我的问题是:是否可以更改序列的起始值以解决这个问题?

5个回答

58

您可以使用RESTART WITH来更改当前序列号以修改序列;

ALTER SEQUENCE test_seq RESTART WITH 300;

如果您使用“serial”关键字创建序列,则可使用以下方法获取序列名称:

SELECT adsrc FROM pg_attrdef WHERE adrelid = (SELECT oid FROM pg_class WHERE relname = 'table name goes here'); 

一个可供测试的SQLfiddle


所以为了改变起始值,我需要创建一个序列。 - afk
2
@user1086267:serial列是由序列填充的。请务必阅读手册,所有内容都在那里有详细记录。 - user330315
2
如果您使用serial关键字创建序列,请使用以下代码获取序列名称:SELECT adsrc FROM pg_attrdef WHERE adrelid = (SELECT oid FROM pg_class WHERE relname = 'table name goes here'); - Joachim Isaksson
6
最新的Postgres中不再存在“adsrc”列。 - Lahiru Chandima

18

PostgreSQL

ALTER SEQUENCE tablename_columnname_seq RESTART WITH anynumber;

例子:

ALTER SEQUENCE test_table_rec_id_seq RESTART WITH 4615793;

5
如果您的Postgresql版本高于上一个答案,您可以尝试使用 select pg_get_serial_sequence('ingredients', 'id'); 来获取序列键。
另外,您也可以使用 SELECT adsrc FROM pg_attrdef WHERE adrelid = (SELECT oid FROM pg_class WHERE relname = 'ingredients'); 语句。

3

对于那些试图指向特定模式表的人,这里是您需要执行的查询。

// To get the sequence name
SELECT pg_get_serial_sequence('"yourSchema"."yourTable"', 'yourColumn');
//Output: yourSchema."yourTable_yourColumn_seq"

ALTER SEQUENCE yourSchema."yourTable_yourColumn_seq" RESTART WITH 100;

-1
以上的解决方案并不适用于我需要的内容。
我需要一个序列 ID 作为主键,它从1000开始而不是从1开始。
为了做到这一点,我创建了一个标准的序列列:
ALTER table my_table ADD COLUMN new_id SERIAL PRIMARY KEY;

然后更新了该列:

UPDATE my_table set new_id = new_id + 1000;

然后我将该表与现有的id号不连续且小于1000的表进行了连接。


是的@aclong,我也不确定为什么会被踩。我可以说一年后,我使用这种方法从未遇到任何问题。或许最好使用两列的组合作为p键。可以是PRIMARY KEY (source, serial_column),其中source是['source_1','source_2'],serial_column是从1开始的两个序列列的并集,以便'source_1,1'source_2,1 独立,但那对我的目的来说不太有效。如果您喜欢,可以点赞 :) - Hugh_Kelley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接