[pgsql-jp: 38752] Re: 配列と外部キー

ITAGAKI Takahiro itagaki.takahiro @ oss.ntt.co.jp
2007年 9月 13日 (木) 12:12:15 JST


板垣です。

koyama <mlus @ hintmark.com> wrote:

> テキスト型の配列データカラムに、外部キー設定をつけたいのですが、
> 無理なのでしょうか?

今のところ、「配列 → 要素」という外部キーはサポートしていません。
ただ、TODO リスト (http://www.postgresql.org/docs/faqs.TODO.html) には
該当する項目があるので、有志がいれば、そのうち実現されるかもしれません。
|  Referential Integrity
|    Change foreign key constraint for array -> element to mean element in array?


> ALTER TABLE stb ADD CONSTRAINT stb_fkey1 FOREIGN KEY(fdat)
> REFERENCES mtb(keycol);

CHECK 制約 や TRIGGER を駆使すれば、ある程度は似たような動作にできます。
以下のような CHECK 制約を使えば、INSERT や UPDATE は制限できました。

=# CREATE FUNCTION in_mtb(text[]) RETURNS boolean LANGUAGE sql AS
    'SELECT count(*) = array_upper($1, 1) FROM mtb WHERE keycol = ANY ($1)';
=# ALTER TABLE stb ADD CONSTRAINT stb_fkey1 CHECK (in_mtb(fdat));

ただ、これだけだと mtb 側の変更には対応できす、
外部キーが張られていても、変更や削除ができてしまいます。
特に排他制御の扱いが面倒で、完全互換にするには手間がかかりそうです。
配列でなく、正規化して行を分けて格納するのが、現実的な解かもしれません。




pgsql-jp メーリングリストの案内