2016-08-17 11 views
1

INSERTまたはUPSERT(ON CONFLICT UPDATE)を実行するたびに、各テーブルのインクリメントカラムは、その前のアップデート数でインクリメントされます。例えば各更新時にPostgreSQL自動インクリメントが増加する

、私はこのテーブルがある場合:

id int4 
title text 
description text 
updated_at timestamp 
created_at timestamp 

をそして、これらのクエリを実行します。

INSERT INTO notifications (title, description) VALUES ('something', 'whatever'); // Generates increments ID=1 

UPDATE notifications title='something else' WHERE id = 1; // Repeat this query 20 times with different values. 

INSERT INTO notifications (title, description) VALUES ('something more', 'whatever again'); // Generates increments ID=22 

は、これは非常に大きな問題です。実行中のスクリプトは毎日100,000件以上の通知を処理します。これにより、各インサートの間に10,000のオーダーのギャップができるので、100行から開始することができますが、1,000行に達するまでに、その最後の行に対して100000を超える自動インクリメントのプライマリキーID値があります。

これが続くと、テーブルの自動インクリメント値がすぐに使い果たされます。

PostgreSQLサーバの設定が間違っていますか? Postgresの使用9.5.3。

私はEloquent Schema Builder(例:$table->increments('id'))を使用してテーブルを作成していますが、そのテーブルと何か関係があるかどうかはわかりません。

+0

"*これが続く場合は、テーブルの自動インクリメント値がすぐに使い果たされます。毎秒10.000の値**を24時間365日(何も休止なし)に燃やすと、(bigint)値がなくなるまでに29.247.120年かかるでしょう –

答えて

5

シーケンスは、挿入が成功したかどうかにかかわらず挿入が試行されるたびに増分されます。単純なupdate(例のように)は増やされませんが、insertupdateの前に試されているので、insert on conflict updateが使用されます。

解決策の1つはidbigintに変更することです。もう一つは、シーケンスを使用せずに自分で管理することです。もう1つは、マニュアルアップサートを実行することです。はユニークであるとします。

関連する問題