MySQLの場合、phpMyAdminでプライマリーキーにautoincrimentを設定するのは簡単なんですよ。チェックボックス一つつけるだけでいいですからね。
でもpostgreSQLはそうもいかない。
というのもも、たぶんだけど、正確にMySQLで言うところのautoincrimentという機能は、postgreSQLにはないような気がします。
じゃあどうやって設定するかってことなんですが、新規にテーブルを作成する場合は、難しくはない。カラムのデータ型で「SERIAL」という型を設定しておけば、カラムのデフォルト値に自動で↓こんなのが入ります。
sampleというテーブルでidというカラムにautoincrimentをつけようとすると、こんな感じのデフォルト値が入る。
でも、問題はすでに存在するカラムにautoincrimentの設定をつける場合。
まず、カラムの変更で型を指定するときに、「SERIAL」ってのがないんですよね。どこを探しても出てこない。sから始まるデータ型は「smallint」と「smgr」という型だけ。smgrってなんだろね。「super marvelous great range」ですかね。すげーデータ型だな。使いたいわ。
で、SERIAL型を指定できないのでさあどうしようってことなんですが、「なら仕方なく自分でnextval~ってのを書けばええやん?」って思うでしょ? 俺も思ったよ。
でもダメなんですよ。実際に書いてみりゃ分かるんですけど「リレーションが存在しません」的なエラーが出て、設定ができないんですよ。
だから今までは一回カラムを削除して新規にカラムを追加して作ってたんですけど、そんなことをしなくても設定できる方法がやっと分かりました。
答えは「シーケンスの作成」にありました。
phpPgAdminでデータベースにアクセスして、publicの画面を開くと、シーケンスってメニューがあるんですよ。
ここでシーケンスを作成すると、上記のようなnextval~って直に書いてもリレーションが存在しないってエラーにはならないことが分かりました。
シーケンス名は「sample_id_seq」ですね。これで解決。
いや~、マジで助かったよ。
今度大規模なデータの移行があって、今までアソシエーションしてたテーブルのアソシエーションが外れるから、プライマリーキーにautoincrimentをつけたかったんだけど、どうやってもつけられないから、カラムを追加し直そうと思ってたんですよね。でも考えてみたらそれでIDを一から振り直すとかなりやばいところに影響出ることに気づいてしまったんで、お手上げ状態だったんですが……何とかなりそうで良かったです。
まあ、そりゃいくらなんでも一度作ってしまったカラムにそんな設定ができないってことはないですよね。
でも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を一から振り直すとかなりやばいところに影響出ることに気づいてしまったんで、お手上げ状態だったんですが……何とかなりそうで良かったです。
まあ、そりゃいくらなんでも一度作ってしまったカラムにそんな設定ができないってことはないですよね。
この記事のおかげで助かりました!