Oracle:Update時に、ORA-01779: キー保存されていない表にマップする列は変更できません のエラーが発生
SQL (37 items)
2004年08月11日
ビューUPDATE文で更新先のレコード1行に更新元のレコードが複数行対応する場合(一意にならない可能性がある場合)発生する。
例
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 */」を入れることにより、エラーが発生しなくなる。
例(改善)
ただし更新先のレコード1行に更新元のレコードが複数行対応するケースがある場合、
更新先のレコードが複数回更新されてしまう為、使い方に注意が必要
例の場合だと、TEST2テーブルに、「ID=1,KEYID1=1,KEYID2=0,KEYDATE=20040801」
「ID=1,KEYID=1,KEYID2=0,KEYDATE=20040802」のデータがあると、TEST1テーブルのNAMEを2回更新することになる。
例
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回更新することになる。
<スポンサードリンク>
<スポンサードリンク>
前の記事 次の記事