34

我对序列号有一点问题:从一个文件中,我填写了我的数据库,其中有一个客户端 ID(它是一个序列号,它是我的主键)。我有 300 个客户,所以有 300 个客户 ID(1 到 300)。现在我的问题是,我有一个新客户的表格。我无法添加它们,因为当我添加一个客户时,我的程序添加了 ID 1 的客户或 ID 1 已经分配给另一个客户。

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

4

5 回答 5

52

您可以使用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

于 2013-05-03T15:55:39.437 回答
11

PostgreSQL

ALTER SEQUENCE tablename_columnname_seq RESTART WITH anynumber;

例子:

ALTER SEQUENCE test_table_rec_id_seq RESTART WITH 4615793;
于 2020-08-19T12:03:40.150 回答
1

如果您的 Postgresql 版本高于上层答案,您可以尝试使用select pg_get_serial_sequence('ingredients', 'id');

SELECT adsrc FROM pg_attrdef WHERE adrelid = (SELECT oid FROM pg_class WHERE relname = 'ingredients');

于 2020-11-14T07:48:01.757 回答
0

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

// 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;
于 2021-12-17T06:37:53.207 回答
-2

上面的解决方案不适用于我所需要的。

我需要一个序列号作为从 1000 开始的主键,而不是 1。

为了做到这一点,我创建了一个标准的串行列:

ALTER table my_table ADD COLUMN new_id SERIAL PRIMARY KEY;

然后更新该列:

UPDATE my_table set new_id = new_id + 1000;

然后,我将该表加入到现有非连续 ID 编号低于 1000 的表中。

于 2020-05-29T19:30:15.487 回答