前回、PostgreSQLでテーブルを作成した際に、カラムのデータ型を後から変更したくなったので、ALTER文でいこうとしたらエラーになったのですが、
[PostgreSQL] ALTER文でserial型に変えることはできないみたい。 · DQNEO起業日記
さんによると、ALTER文ではserial型に変更することはできないみたいです。
カラムをserialに変更
テーブル作成後にカラムを変更してみます。コマンドプロンプトでPostgreSQLに接続できるフォルダまで移動し、psqlコマンドを実行し
psql -U postgres
PostgreSQLに接続します。
接続したら、DBを選択します。databasenameの部分は自分で作成したデータベース名を入力入力します。
¥c databasename
シーケンスオブジェクトを作成します。tablename_colname_seqの部分は、テーブル名 + serialにしたいカラム名 + seqで大丈夫かと。
CREATE SEQUENCE tablename_colname_seq;
シーケンスオブジェクトのnextval()メソッドの結果をセットします。
ALTER TABLE tablename ALTER colname SET DEFAULT nextval('tablename_colname_seq');
シーケンスは指定されたテーブル列に関連付けられ、その列(やテーブル全体)が削除されると、自動的にシーケンスも一緒に削除されるようになります。
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
今回は、テーブルにデータが何もない状態でしたが、既にテーブルにデータが入っている場合で、既存のデータの連番が100で終っている場合は、
SELECT setval('tablename_colname_seq', 100);
のように連番の値を進めておく必要があるようです。
A5:SQL Mk-2でcsvファイルからテーブルにデータを登録
A5:SQL Mk-2では、csvファイルでテーブルにデータを格納できるようです。
serialに指定したカラムの部分は、csvファイルのときに空にすれば良いようです。
・忘備録 CSVデータのインポート オートインクリメントカラムの設定
A5:SQL Mk-2の左のデータベースツリーのテーブルのordersを開くとカラムのデータ型が確認できました。デフォルトにシーケンスオブジェクトのnextval()メソッドが設定されてます。
order_idをserialにしたので、用意するcsvファイルは下記のようにorder_idに該当する先頭部分のデータを空白にしてます。
, 2017-02-09, 佐藤 一徹, 3 , 2017-02-09, 鈴木 一郎, 2 , 2017-02-10, 高橋 一斗, 7 , 2017-02-10, 田中 一広, 3 , 2017-02-11, 伊藤 一雄, 4 , 2017-02-11, 渡辺 一也, 1 , 2017-02-11, 山本 一和, 5 , 2017-02-11, 中村 一成, 2
テーブルを選択した状態で、上部メニューの『テーブル(T)』>『CSV/TSVインポート(I)』を選択します。
作成したcsvファイルを選択します。
『1行目をデータとして扱わない』のチェックを外し『OK』。
データを確認すると、csvファイルのデータがテーブルにインポートされています。
serialをIntegerに戻したい
order_detailsテーブルのorder_lineのデータ型をserialからIntegerに戻したくなったので変更。今回、自分の場合は、tablenameの部分はorder_details、colnameの部分はorder_line、tablename_colname_seqの部分はorder_details_order_line_seqになります。
ALTER TABLE tablename ALTER COLUMN colname DROP DEFAULT; DROP SEQUENCE tablename_colname_seq;
・【備忘録】PostgreSQLでserial型をinteger型に変更する | データベース | 株式会社メイドインクリニック
むちゃくちゃ失敗してますが、最終的にはorder_lineカラムのシーケンスも無くすことができました。
デフォルトの部分からシーケンスオブジェクトのnextval()メソッドが無くなりました。
次回こそ、Javaとの連携をしていきたいと思います。
今回はこのへんで。