読者です 読者をやめる 読者になる 読者になる

PostgreSQLのテーブルのデータ型をserial型に変更したい

前回、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()メソッドが設定されてます。

f:id:ts0818:20170212205306j:plain

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)』を選択します。

f:id:ts0818:20170212205714j:plain

作成したcsvファイルを選択します。

f:id:ts0818:20170212210326j:plain

『1行目をデータとして扱わない』のチェックを外し『OK』。

f:id:ts0818:20170212220724j:plain

データを確認すると、csvファイルのデータがテーブルにインポートされています。 

f:id:ts0818:20170212205307j:plain

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カラムのシーケンスも無くすことができました。

f:id:ts0818:20170212220037j:plain

デフォルトの部分からシーケンスオブジェクトのnextval()メソッドが無くなりました。

f:id:ts0818:20170212222746j:plain

次回こそ、Javaとの連携をしていきたいと思います。