以下のように表示されます。
(日本語)
ORA-01779: キー保存されていない表にマップする列は変更できません
(英語)
ORA-01779: cannot modify a column which maps to a non key-preserved table.
発生パターン
このエラーは以下のような場合に発生します。
- VIEWに対するUPDATEを行った時、更新するレコードが一意にならない。
発生例
まず、以下のようなVIEWを作成します。
- VIEWの作成
- SQL> select * from tbl01; LOT CODE -------------------- --------- 100 A 200 B 300 C SQL> select * from tbl02; CODE NAME -------------------- --------- A aaa B bbb C ccc D ddd E eee SQL> CREATE OR REPLACE VIEW v_test (LOT, NAME) AS SELECT a.lot, b.name FROM tbl01 a, tbl02 b WHERE a.code = b.code(+) /
上記で作成したVIEWに対して、以下のようなUPDATEを行います。
- エラー例
- SQL> update v_test set name = 'xxx' where lot = '200'; update v_test set name = 'xxx' where lot = '200' * 行1でエラーが発生しました。: ORA-01779: キー保存されていない表にマップする列は変更できません
tbl02.nameを更新するレコードが一意とならないため、エラーとなります。
対処法
- VIEWのSELECTを主キーの内部結合とし、レコードが一意となるようにする。
- VIEWではなく、TABLEを直接更新する。