Web Artisan Blog - ウェブ アルチザン ブログ

Oracle:Update時に、ORA-01779: キー保存されていない表にマップする列は変更できません のエラーが発生

SQL (37 items)

2004年08月11日

ビューUPDATE文で更新先のレコード1行に更新元のレコードが複数行対応する場合(一意にならない可能性がある場合)発生する。


UPDATE (
SELECT a.NAME
FROM TEST1 a,TEST2 b
WHERE a.ID = b.ID
AND a.KEYID = b.KEYID1
AND b.KEYID2 =0) A
SET A.NAME = 'TEST';



TEST1テーブルのキー項目・・・ID,KEYID
TEST2テーブルのキー項目・・・ID,KEYID1,KEYID2,KEYDATE

上記の場合、a.ID = b.ID AND a.KEYID = b.KEYID AND b.KEYID2 =0だけではTEST2テーブルのレコードは一意にならない為、発生する。

回避策
SELECT項目に 「/*+ BYPASS_UJVC */」を入れることにより、エラーが発生しなくなる。

例(改善)

UPDATE (
SELECT /*+ BYPASS_UJVC */ a.NAME
FROM TEST1 a,TEST2 b
WHERE a.ID = b.ID
AND a.KEYID = b.KEYID1
AND b.KEYID2 =0) A
SET A.NAME = 'TEST';



ただし更新先のレコード1行に更新元のレコードが複数行対応するケースがある場合、
更新先のレコードが複数回更新されてしまう為、使い方に注意が必要

例の場合だと、TEST2テーブルに、「ID=1,KEYID1=1,KEYID2=0,KEYDATE=20040801」
「ID=1,KEYID=1,KEYID2=0,KEYDATE=20040802」のデータがあると、TEST1テーブルのNAMEを2回更新することになる。

<スポンサードリンク>
<スポンサードリンク>
前の記事 次の記事

Comments

コメントは、まだ書かれていません

Add Comments

Trackback

トラックバックはありません

Trackback URL

http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=222