我对序列号有一点问题:从一个文件中,我填写了我的数据库,其中有一个客户端 ID(它是一个序列号,它是我的主键)。我有 300 个客户,所以有 300 个客户 ID(1 到 300)。现在我的问题是,我有一个新客户的表格。我无法添加它们,因为当我添加一个客户时,我的程序添加了 ID 1 的客户或 ID 1 已经分配给另一个客户。
所以我的问题是:是否可以更改序列的起始值来解决这个问题?
我对序列号有一点问题:从一个文件中,我填写了我的数据库,其中有一个客户端 ID(它是一个序列号,它是我的主键)。我有 300 个客户,所以有 300 个客户 ID(1 到 300)。现在我的问题是,我有一个新客户的表格。我无法添加它们,因为当我添加一个客户时,我的程序添加了 ID 1 的客户或 ID 1 已经分配给另一个客户。
所以我的问题是:是否可以更改序列的起始值来解决这个问题?
您可以使用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');
PostgreSQL
ALTER SEQUENCE tablename_columnname_seq RESTART WITH anynumber;
例子:
ALTER SEQUENCE test_table_rec_id_seq RESTART WITH 4615793;
如果您的 Postgresql 版本高于上层答案,您可以尝试使用select pg_get_serial_sequence('ingredients', 'id');
和
SELECT adsrc FROM pg_attrdef WHERE adrelid = (SELECT oid FROM pg_class WHERE relname = 'ingredients');
对于那些试图指向特定模式表的人,这里是您需要执行的查询。
// 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;
上面的解决方案不适用于我所需要的。
我需要一个序列号作为从 1000 开始的主键,而不是 1。
为了做到这一点,我创建了一个标准的串行列:
ALTER table my_table ADD COLUMN new_id SERIAL PRIMARY KEY;
然后更新该列:
UPDATE my_table set new_id = new_id + 1000;
然后,我将该表加入到现有非连续 ID 编号低于 1000 的表中。