[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 メーリングリストの案内