2017-06-22 14 views
0

私はPostgresがいくつかの初期データをインポートした後に重複したIDを訴えていて、IDカラムカウンタをインクリメントする方法を知りたいという問題がありますか?初期データの挿入後にPostgresがID「already exists」を返すのですか?

詳細:私は最近、idが私のSequelizeモデル定義にオートインクリメントに設定されているPostgresのテーブルの中にいくつかの初期データをアップロードした

。私はそれがKey (id)=(1) already existsを文句新しいレコードを挿入しようとすると、私のNode.jsアプリケーションから

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

:たとえば:

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

データ挿入は次のようになります。 SQL Sequelizeを使用している形式は次のとおりです。

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

私は、レコードのテーブルは空だと、私はカウンタはインクリメントを行い参照、もう一度これを試すかの操作に十分な時間を再試行した場合。問題は、Postgresがレコードに基づいて現在の最大IDを知ることができないようです。

初期データをデータベースにアップロードした後、Postgresにカウンタを更新するように指示する正しい方法は何でしょうか?

ところで使用してPostgresの

+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; 

このコードは、ここでそれは私のusers表され、テーブル内の現在の最大IDにidを設定します。シーケンスは、列に関連付けられている場合、これは動作しますチェックするために、注:「。国民

SELECT pg_get_serial_sequence('patients', 'id') 

注意すべき唯一のことは、あなたが無視するということです戻り値の一部。

最初のデータスクリプトにsetval()を追加します。

0

9.6それは前回の実行から持続することができる、追加しようとした前に、その場合には(1、「ボブ」)がすでにテーブルにあるであろう、あなたが最初にデータを挿入する前に、テーブルをドロップしてくださいもう一度。

+0

問題は最初の追加中ではなく、その後の通常の操作中に発生します。指定されたIDを持つすべての値は正しく追加されましたが、 'DEFAULT' IDを持つ値は正しく追加されませんでした。これをpsqlコマンドラインからシミュレートすると、ID付きの挿入が列のインクリメンタを更新していないことが示唆されます。 –

+0

私は間違いを見ます。私はpostgresに十分に精通しているわけではないので、自動生成される必要のある次のid値を追跡する方法についてコメントしています – littlespice3

関連する問題