2017-06-22 81 views
0

我有一個問題,Postgres在導入一些初始數據後抱怨重複的ID,我試圖看看如何增加id列計數器?插入初始數據後Postgres抱怨ID'已經存在'?

詳情:

我最近上傳了一些初始數據到一個Postgres的表,其中ID設置在我的Sequelize模型定義爲自動增量。例如:

sequelize.define('user', { 
     id: { 
      type: Sequelize.INTEGER, 
      primaryKey: true, 
      autoIncrement: true 
     }, 
     name: Sequelize.STRING 
    } 

插入數據是這樣的:

INSERT INTO "users" ("id","name") VALUES(1, "bob"); 
INSERT INTO "users" ("id","name") VALUES(2, "brooke"); 
INSERT INTO "users" ("id","name") VALUES(3, "nico"); 

現在從我的node.js應用程序,當我嘗試插入抱怨Key (id)=(1) already exists的新紀錄。在SQL Sequelize使用採用形式:

INSERT INTO "users" ("id","name") VALUES(DEFAULT, "nico"); 

如果我是空的記錄表,並再次嘗試這個或重試操作足夠的時間,然後我看到櫃檯做增量。這個問題似乎根據記錄Postgres無法確定當前的最大ID是什麼?

在將初始數據上傳到數據庫後,告訴Postgres更新計數器的正確方法是什麼?

BTW使用的是Postgres 9.6

+0

[Postgresql SERIAL的工作方式是否有所不同?](https://stackoverflow.com/a/18389891/1995738) – klin

+0

另請參見[串行類型](https://www.postgresql.org/docs/current/static/) datatype-numeric.html#DATATYPE-SERIAL) – klin

+0

鏈接文章中描述的行爲與我們在此處看到的內容相符。這是手動指定id值不會更新序列。只有'DEFAULT'遞增該值,所以刷新序列看起來很重要。這與MySQL不同,例如,它基於列中的最大值自動遞增。 –

回答

0

經過多一點搜索後,事實證明這將做我需要做的。

SELECT setval('users_id_seq', max(id)) FROM users; 

該代碼將設置id爲當前最大的id在表中,這是我users表。請注意,要檢查一個序列是否與列關聯,這將起作用:

SELECT pg_get_serial_sequence('patients', 'id') 

唯一要注意的是,您忽略了「公共」。部分在返回值中。

我會將setval()添加到我的初始數據腳本中。

0

嘗試刪除表您最初插入數據之前,它可能從以前的運行中堅持在這種情況下,(1,「鮑勃」)應該已經在你的表,你嘗試添加之前它再次。

+0

問題不在最初添加期間,而是在正常操作之後。所有具有指定id的值都正確添加,但不是具有「DEFAULT」ID的值。從psql命令行模擬這一點表明,使用id插入不會更新列的增量器。 –

+0

我明白了,我的錯誤。我並不完全熟悉postgres來評論如何跟蹤需要自動生成的下一個id值 – littlespice3