「PostgreSQL」カテゴリーアーカイブ

Postgresでカラムのデータ型を変更する

Postgresで普通にphpPgAdminでカラムのデータ型を変更しようとすると、column "column_name" cannot be cast to type "pg_catalog.int4"と怒られてしまう。テキスト型を整数型に変更しようとしたんだけど、無理?

いや、諦めずにグーグル先生に聞いてみることにしよう。
ALTER TABLE table_name ALTER COLUMN column_name TYPE integer USING column_name::integer;と、とある掲示板に書かれている。そのまま無鉄砲にSQLを実行したらなんとすんなり出来てしまった。

な〜んだ。

新たなDatabaseの作成

また新たなアプリケーションを作ってしまったんだけど、毎回PostgreSQLのhow-toサイトを参照しては忘れてしまったDBの作成方法を思い出しているのはしゃくだから、ここでまとめてしまおう。あ、でも、PostgreSQLはFC3で導入済みだし、初期設定はとうの昔に忘れてしまっているから、それはまた新たにサーバを建てるときにでも書くとしよう。

まず、前提条件として、PostgreSQLが導入されていて、初期設定が終わっていること。ただ単にDBを作成してテーブルを作っていく、と言う部分だけ。

最初はpostgresユーザになる。# su postgresそして、コマンドラインで新たなテーブルを作成する。$ createdb fooここではfooと言うDBを作っている。

次にテーブルを作成するわけだが、ここは安全にSQLを記述したファイルを作成し、そのファイルを元にSQLを発行したほうが安全なのである。まず、viか何かで以下のようなテキストファイルを作る。drop table hogehoge;
CREATE TABLE hogehoge (
item1 varchar,
item2 varchar,
item3 integer,
item4 varchar,
item5 varchar
);
hogehogeというテーブルを作成するわけだけど、まずdropで既に作ってある場合には削除するコマンドを先に書いておく。そうすると再作成するときに便利だからね。次に、テーブル定義を書く。当然ながらテーブル定義はこの時点である程度固まっている必要がある。

このファイル元に$ psql -f ファイル名 fooとコマンドラインで実行すればファイルに記述されたSQLが発行される。結構忘れがちなのが、項目名として ” – “(マイナス) が使えないことである。” _ “(アンダーバー)で代用するんだね。

ちなみに、主キーは次のように設定する。CREATE TABLE hogehoge (
item1 varchar primary key,
item2 varchar,
item3 integer,
item4 varchar,
item5 varchar
);

複合キーは次のように設定する。CREATE TABLE hogehoge (
item1 varchar primary key,
item2 varchar,
item3 integer,
item4 varchar,
item5 varchar,
constraint KEY_NAME primary key (
item1,
item2
)
);
主キーが一つの項目であってもこのように設定する癖をつけておくほうがいいかも。ちなみに、”KEY_NAME”(制約名)は他のテーブルの制約名とは違う名前にしておかないといけない。

テーブルを作ったらPostgreSQL上で確認しよう。$ psql fooでPostgreSQLコンソールを立ち上げて、foo=# \dでテーブル一覧、foo=# \d hogehogeでhogehogeテーブルの定義を見ることができる。

このままだとphpなどからアクセスするときに権限が無いとかいって怒られるから、apacheに権限を与える。PostgreSQLコンソールで、foo=# grant all on テーブル名 to apache;とコマンドを実行する。権限はテーブル単位に与えるものだから、新たなテーブルを作る度にこの設定を行う必要がある。

スクリプトを書いている途中で項目が必要になってくることが多々ある。本当はすべての設計を終えてからコーディングに入るべきだろうけど、いつもてきとーに作り始めることが多いから、後から項目を足す必要が出てくる。PostgreSQLでは後から項目を足すことが出来る。これは大抵PostgreSQLコンソールから入力してしまうな、普通は。foo=# alter table テーブル名 add
foo=# newitem varchar
foo=# ;
新たな項目はテーブルの最後尾に付け足される。MySQLやOracleではテーブルの任意の場所に付け足すことができるみたいだけどね。

PostgreSQL+PHPのアプリケーションを作るときにDB的に毎回気をつけないといけない点といったらこのくらいかな。