2016-11-18 21 views
0

我正在使用postgres 9.5。作爲應用程序初始化的一部分,我使用隨機ID在應用程序啓動時在數據庫中創建一些插入。類似於insert into student values(1,'abc'),insert into student values(10,'xyz')。然後我開發了一些其他API,以編程方式插入新行。有沒有什麼辦法可以告訴postgres跳過已經採取的id?重置postgres序列以取未使用的主鍵ID

它試圖佔用已經使用過的ID。我注意到它沒有初始的插入順序更新的會計

這裏是我創建表

CREATE TABLE student(
    id     SERIAL PRIMARY KEY, 
    name    VARCHAR(64) NOT NULL UNIQUE  
); 
+0

添加了表格定義。是否仍然可以插入ids 1,然後是10,當我嘗試使用API​​插入時仍然跳過10?在API中,我使用'insert into student values(default,'def')'而不是數字ID。 – aaj

回答

1

您可以提前被填充id列到最高值的順序:

insert into student (id, name) 
values 
    (1, 'abc'), 
    (2, 'xyz'); 

select setval(pg_get_serial_sequence('student', 'id'), (select max(id) from student)); 
+0

我同意這會工作。但這是問題 - 我在數據庫中的數據是分佈式的。我有ids。 1,10,20,30,40等等。是否有可能有id = 2到9然後跳轉到11? – aaj

+0

@ love2code:這是一個全新的問題。是的,你可以做到這一點,如果你手動控制序列,並使用增量2而不是1 –

+0

對不起,如果問題不是很清楚,但這是我的原始問題。如果序列肯定被跳過1個值,++ 2將起作用。但如果我有隨機ID。 fr例如:10,20,21,30,31,32,33,35,40,45等++ 2不會工作 – aaj

2

聽起來,如果你的數據是分佈式的,你可能會更好地使用UUID作爲主鍵值。