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