postgreSQLでautoincrimentを実装する

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
MySQLの場合、phpMyAdminでプライマリーキーにautoincrimentを設定するのは簡単なんですよ。チェックボックス一つつけるだけでいいですからね。

でもpostgreSQLはそうもいかない。

というのもも、たぶんだけど、正確にMySQLで言うところのautoincrimentという機能は、postgreSQLにはないような気がします。

じゃあどうやって設定するかってことなんですが、新規にテーブルを作成する場合は、難しくはない。カラムのデータ型で「SERIAL」という型を設定しておけば、カラムのデフォルト値に自動で↓こんなのが入ります。

nextval('sample_id_seq'::regclass)

sampleというテーブルでidというカラムにautoincrimentをつけようとすると、こんな感じのデフォルト値が入る。

でも、問題はすでに存在するカラムにautoincrimentの設定をつける場合。

まず、カラムの変更で型を指定するときに、「SERIAL」ってのがないんですよね。どこを探しても出てこない。sから始まるデータ型は「smallint」と「smgr」という型だけ。smgrってなんだろね。「super marvelous great range」ですかね。すげーデータ型だな。使いたいわ。

で、SERIAL型を指定できないのでさあどうしようってことなんですが、「なら仕方なく自分でnextval~ってのを書けばええやん?」って思うでしょ? 俺も思ったよ。

でもダメなんですよ。実際に書いてみりゃ分かるんですけど「リレーションが存在しません」的なエラーが出て、設定ができないんですよ。

だから今までは一回カラムを削除して新規にカラムを追加して作ってたんですけど、そんなことをしなくても設定できる方法がやっと分かりました。


答えは「シーケンスの作成」にありました。

phpPgAdminでデータベースにアクセスして、publicの画面を開くと、シーケンスってメニューがあるんですよ。

ここでシーケンスを作成すると、上記のようなnextval~って直に書いてもリレーションが存在しないってエラーにはならないことが分かりました。

シーケンス名は「sample_id_seq」ですね。これで解決。


いや~、マジで助かったよ。

今度大規模なデータの移行があって、今までアソシエーションしてたテーブルのアソシエーションが外れるから、プライマリーキーにautoincrimentをつけたかったんだけど、どうやってもつけられないから、カラムを追加し直そうと思ってたんですよね。でも考えてみたらそれでIDを一から振り直すとかなりやばいところに影響出ることに気づいてしまったんで、お手上げ状態だったんですが……何とかなりそうで良かったです。

まあ、そりゃいくらなんでも一度作ってしまったカラムにそんな設定ができないってことはないですよね。
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2015年07月08日 09:38:47
こんにちわ
ありがとうございます!
この記事のおかげで助かりました!
2015年07月09日 09:35:21
まっち~(管理人)
>こんにちわさん
どもども、お役に立てて何よりです!
2017年07月14日 18:11:45
長万部
リレーション"hibernate_sequence"は存在しません”、というエラーメッセージ。
ググってもわからず、このサイトにたどりついてもしやと思い、hibernate_sequenceを記載通りに作ってみたら、動きました。
感謝、感謝。
2017年07月15日 09:55:09
まっち~(管理人)
>長万部さん
いえいえ、無事に動いてよかったです〜。