[pgsql-jp: 27950] Re: view/rule/insert
Satoshi Nagayasu
snaga @ snaga.org
2002年 11月 12日 (火) 16:00:31 JST
永安です。
Jun Kitamura <kitamura @ zoozee.jp> wrote:
> 北村@zoozee です。
>
> > 実際に作ってるものは、4つくらいの外部参照があって、
> > それをviewにくるんでいるので、すべての外部参照先に対する
> > 「あればselect、なければinsertしてselect」というのを、
> > viewに対する一つのinsert(のdo〜句)ににおいて
> > implicitに呼び出したいのですが。
> >
> > そーゆーときはこーやるもんだ、みたいなセオリーがありましたら、
> > どなたかお教えくださると助かります。
> >
> > あと、質問の意味が分からなかったらご指摘いただけると幸いです。
>
> チャチャっぽいんですが、我慢してください。:-)
> そもそも、参照先にソレが無ければダメだ、という制約のために外
> 部参照キー付けてるんですよね?(やろうとしてることが矛盾して
> ない?)
参照先が無ければダメなのはその通りなのですが、基本的にINSERTのときに参照
先が無い、ということは想定されてません。「無ければ作る」。
というのは、元のデータがCSVのような一枚のシートになっていて、重複する値
のあるフィールドを外部参照で別テーブルに飛ばしているんです。
> c1 | c2 | c3 | c4 | c5 | c6
> ------------+-----------------+------------+---------+-----------+----------
> 0610005A07 | ontology_F | GO:0004364 | MGD | MGI:95861 | MGI
このデータが一番元のCSVに近いのですが、コラムc1には「0610005A07」というのが
10コ出てくるかもしれないし、1コしか出てこないかもしれない。100コかもしれない。
このときに、「0610005A07」というテキストを外部のテーブルに出して、
c1_no というシリアル値で参照させてます。
> c1_no | c2_no | c3 | c4_no | c5 | c6_no
> ------------+--------------+------------+------------+-----------+-------------
> 1 | 1 | GO:0004364 | 1 | MGI:95861 | 1
> c1 | c1_no
> ------------+------------
> 0610005A07 | 1
なので、INSERTするときに参照先が無い、ということは基本的に無いはずなのです。
「無いはず」というか、無い場合には登録しなければならないのです。
viewで見たときに、
> c1 | c2 | c3 | c4 | c5 | c6
> ------------+-----------------+------------+---------+-----------+----------
> 0610005A07 | ontology_F | GO:0004364 | MGD | MGI:95861 | MGI
のようにCSVのように展開されないといけないので。
> t1 の BEFORE トリガで、INSERT する前に c1 をチェックして、無
> ければトリガ内で(c1に) INSERT をしてしまえば良いのでは?
> これなら、外部参照制約をつけたままでも OK かもしれません。
> VIEW に対するルールよりも、t1 に対するトリガ(ルールでもでき
> るかも)で対処すべき問題のような気がします。
これ読んでハタと気がつきました。
まったくもっておっしゃる通りのような気がします…。
トリガーでやってみます。
ところで、このメールを読む前に、viewへのinsertにおけるルールを
複数定義して、最後のルールでinsertする前に、
外部参照先をチェックするようなルールを定義してみたのですが、
ひとつのテーブルなりviewに対して複数のルールを定義したような場合、
ルールの呼び出される順番って、どのようになるのでしょう?
oid順? ルールの名前順? それとも不定?
ソース読めって? (^^;
# その前にマニュアルか…。
--
NAGAYASU Satoshi <snaga @ snaga.org>
pgsql-jp メーリングリストの案内