PL/pgSQLを使う方法
PL/pgSQLを使おうと思って日本PostgreSQLユーザー会さんのページで関数言語の追加の方法(createlang)を見ながら作業をしたのですが、なぜかできませんでした。ぐぐってみると本家MLのアーカイブにぴったりの回答がありました。
つまり、psqlで入るPostgreSQLのシェルの中ではなく、unixのシェルでcreatelangをすべきでした。
SQL命令のリファレンスではなくコマンドリファレンスページだったことに気づくべきでした…。
ちなみに、やりたかったことはフォーリンキーを含むテーブルを作成するときに、カラムの初期値を外部参照されているIDではなく名前で設定したいというものです。以下サンプル。もっと賢いやり方があれば嬉しいです。
CREATE FUNCTION get_id_from_product_image_type(varchar(128)) RETURNS INTEGER AS ' DECLARE pit_name ALIAS FOR $1; ret_val INTEGER; BEGIN SELECT INTO ret_val pit.id FROM product_image_type AS pit WHERE pit.name=pit_name; RETURN ret_val; END; ' LANGUAGE 'plpgsql'; CREATE TABLE product_image_type ( id SERIAL, name varchar(128), PRIMARY KEY (id) ); INSERT INTO product_image_type (name) VALUES ('primary'); INSERT INTO product_image_type (name) VALUES ('other'); INSERT INTO product_image_type (name) VALUES ('front'); INSERT INTO product_image_type (name) VALUES ('back'); CREATE TABLE product_image ( id SERIAL, name varchar(128), -- type_id int DEFAULT '2', type_id int DEFAULT get_id_from_product_image_type('other'), PRIMARY KEY (id), FOREIGN KEY (type_id) REFERENCES product_image_type (id) ); INSERT INTO product_image (name) VALUES ('image1'); INSERT INTO product_image (name, type_id) SELECT 'image2', pit.id FROM product_image_type AS pit WHERE pit.name='other'; INSERT INTO product_image (name, type_id) SELECT 'image3', pit.id FROM product_image_type AS pit WHERE pit.name='primary';