こんにちは。じじグラマーのカン太です。
「お前の作るシステムは古い」という言葉に傷つきながら、週末プログラマーをしています。
ローカル運用していた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;
本番運用中だと使えませんが、テスト期間とかならこちらの方が早いですね。
まとめ
今回は久々に冷や汗をかきました。ほとんどの画面で使用するテーブルが登録エラーとなったため、運用が一時ストップしてしまいました。
ネット上にはたくさんの親切な人がいます。僕も見習って備忘録として、ここに残しておきます。
コメント