[pgsql-jp: 27941] Re: view/rule/insert

Mashiki mashiki @ yanah.com
2002年 11月 12日 (火) 10:16:07 JST


 Mashikiです。

>とりあえず、あろうが無かろうが insert してみる、というのも
>アリと言えばアリなのでしょうが、それだとキーがカチ合って
>insertが失敗したときに、トランザクションがまるごとabortしそうな
>気がします…(というか試してみたらabortしました。当然ですね…)。

永安さんの戦っているシビアな世界では通用しないかも知れませんが、
あろうが無かろうが、(エラーなしに?)insertしてみる方法のひとつです。

sql=# create table c1( c1_name text primary key, c1_id serial);

sql=# insert into c1 values('aaa');
sql=# insert into c1 values('bbb');

とした場合、

sql=# insert into c1 values('aaa');
  ERROR:  Cannot insert a duplicate key into unique index c1_pkey

ではエラーがでますが、

sql=# insert into c1 select 'aaa'
      where not exists (
        select 1 from c1 where c1_name='aaa'
      );
  INSERT 0 0

sql=# insert into c1 select 'bbb'
      where not exists (
        select 1 from c1 where c1_name='bbb'
      );
  INSERT 0 0

はエラーを出しません。もちろん、以下はインサートも成功します。

sql=# insert into c1 select 'ccc' where not exists (
        select 1 from c1 where c1_name='ccc'
      );
  INSERT 22734848 1

クォートの中を「new.c1_name」としたら、ルール中でも使えないでしょうか。

そもそも、こんなやり方ではタイミングでキーがかち合うこともあるのかな?



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