PostgreSQL ある日突然新規登録できなくなりました

データベース

こんにちは。じじグラマーのカン太です。
「お前の作るシステムは古い」という言葉に傷つきながら、週末プログラマーをしています。

ローカル運用していたMS Accessを、ネット上に置いたPostgreSQLにリンクさせて、疑似クラウドサービスを提供しています。

このPostgreSQLで、あるとき突然新規登録ができなくなりました。
現象は

  • ある特定のテーブルのみ登録できない
  • 更新は可能
  • Access側でのエラーメッセージは「ODBCエラー:登録できません」みたいなそっけないもの
  • 他のテーブルは正常に稼働している

といった感じです。

原因

そのテーブルに「id」を設定していました。PostgreSQL では主キーを省略してレコードを INSERT するとシーケンスを用い、連番で id が採番されます。このidは、ユニークキーとなっているので、重複は許されません。どうやら、何らかの原因でこの採番がおかしくなったようです。

調査

まず、現在降られているidの最大値を取得します。
ここでは、『orders』テーブルに『id』というカラム名だと仮定しています。

SELECT MAX(id) FROM orders

次にシステムが保持しているidの値を取得します。

SELECT * FROM orders_id_seq;


この二つの値が違っていると、登録時に重複エラーとなってしまうようです。

対応

システムが把握しているidを振り直します。

SELECT SETVAL ('orders_id_seq', 12345, true);

これで、システム上の連番が『12345』で振り直しされました。

参考までに・・

連番を1から振りなおす場合

SELECT SETVAL ('orders_id_seq', 1, false);

データを全て消去して振りなおす場合

TRUNCATE TABLE orders_id_seq RESTART IDENTITY;

本番運用中だと使えませんが、テスト期間とかならこちらの方が早いですね。

まとめ

今回は久々に冷や汗をかきました。ほとんどの画面で使用するテーブルが登録エラーとなったため、運用が一時ストップしてしまいました。

ネット上にはたくさんの親切な人がいます。僕も見習って備忘録として、ここに残しておきます。

コメント