2017-08-03 4 views
0

私はIntelliJとデータベースツールを使用しています。Postgresql INSERT - 次のIDを自動取得しますか?

enter image description here

が、私はその後、私の値を変更し、ヒット:

私はクローンオプションを使用し...私はいくつかのデータに問題があったので、私は、行を削除したが、その後多くのカップルを追加したいです commitボタン私は、コンソールおよび手動挿入を経由して試してみました

ERROR: duplicate key value violates unique constraint "Primary Key some_table" Detail: Key (id)=(58) already exists.

が、私は同じエラーを取得:

しかし、挿入はエラーで失敗しました。 私がこれを行うたびに、IDは増分します...私は何千ものレコードを持っていますので、私の指がスナップするまでクリックし続けることはできません。

これは、(表が作成されたとき)idは、次のようになります。

id bigserial not null constraint "Primary Key some_table" 
primary key 

私はテーブルを変更しようとすると、私はidはこのよう設定されたデフォルト値を持っている参照してください。

nextval('some_table_id_seq'::regclass) 

私が試した:

INSERT INTO some_table (id,...columns..) VALUES (DEFAULT,...columns...); 

INSERT INTO some_table (...columns..) VALUES (...columns...); 

が、私は同じエラーを取得...

私はMAX idを取得するクエリを実行している何かlikeを行うことができ実現し、その後、私の挿入を行いますが、それは私には少しばかげているようです。

INSERTは自動的に新しい/次の番号を取得するように調整できますかid

たとえば、MSSQLはnewid()を使用してこれを自動的に処理します。

オーケー更新、私は問題が何であったか...考え出し

私が持っていた以前に、その後もシーケンスをクローン化されたテーブルを、クローン化しました。 idカラムのデフォルト値はsome_tableで、OLDクローンテーブルのシーケンスを使用していました...

新しいシーケンスを使用するようにシーケンス名を変更していました。

挿入を行う際にも、あなたが使用置き換えることができます自動的にidDEFAULTを参照すると同じ)を生成するために

INSERT INTO some_table (id,...columns..) VALUES (nextval('some_table_id_seq'::regclass),...columns...); 

は、あなたの助けのためのみんなに感謝します。教訓:テーブルをクローン化しないでください。怠け者ではない。

答えて

1

あなたは挿入時に列リストで列をスキップし、またはDEFAULTキーワードを使用し、ここのようなことができ、次のいずれか

t=# create table i (i bigserial, t text); 
CREATE TABLE 
Time: 99.579 ms 
t=# insert into i (t) select null; 
INSERT 0 1 
Time: 75.390 ms 
t=# insert into i values(DEFAULT,null); 
INSERT 0 1 
Time: 58.365 ms 
t=# select * from i; 
i | t 
---+--- 
1 | 
2 | 
(2 rows) 
+0

私は私のポストを更新しました - 私は、残念ながらどちらも仕事をこれらのメソッドの両方を試してみましたが、しました。 – pookie

+2

実際には、実際にシーケンスを使用しているように見えますが、手動で指定されたPKで値が挿入され、未使用のシーケンスが残っている可能性があるため、データベースにすでに挿入されている値よりも遅れています。 –

+0

@pookieシーケンスが実際の値より後ろにある場合は、もちろん簡単にリセットすることができますが、シーケンスのオーバーヘッド値を挿入している人を特定してください。 –

0

シーケンスが原因手動で入力されたレコードを(基礎データと同期しなくなる、またはあなたの場合

SELECT SETVAL('some_table_id_seq',MAX(id)+1) FROM some_table 

これはちょうど、現在のテーブルに最高のIDを検索し、次に使用可能な値のシーケンスを更新します。)間違ったシーケンスから来たIDは、次のようなコマンドでそれらをリセットすることができます。

ドキュメント:https://www.postgresql.org/docs/current/static/functions-sequence.html

関連する問題