コンテンツにスキップ
9.8 制約、エラー、トラブルシューティング

9.8 制約、エラー、トラブルシューティング

LOOKUPテーブルの制約、発生し得るエラー、解決方法を説明します。

制約の概要

項目制約代表的なエラー
PRIMARY KEY必須。1つだけ指定ERR-02322, ERR-02171
PRIMARY KEY列SETの対象に指定不可ERR-02176
列の型TEXTCLOBBLOBBINARYは使用不可ERR-02173
JSON列一般列として使用可能。PRIMARY KEYには使用不可
メモリVOLATILEと1つの上限を共有ERR-01344
UPDATEWHERE必須。省略時は実行されない

PRIMARY KEYのエラー

LOOKUPはPRIMARY KEYなしでは作成できず、2つ以上指定することもできません。 次の2文は、それぞれ失敗します。

-- 失敗: PRIMARY KEYがありません。(ERR-02322)
CREATE LOOKUP TABLE ch9_err_nopk (code VARCHAR(16), label VARCHAR(64));

-- 失敗: PRIMARY KEYが2つあります。(ERR-02171)
CREATE LOOKUP TABLE ch9_err_twopk (
    code VARCHAR(16) PRIMARY KEY,
    name VARCHAR(32) PRIMARY KEY
);

どちらの文もテーブルを作成しないため、削除するオブジェクトはありません。 複合キーが必要なら、区切り文字で組み合わせた単一のキー列を用意し、 PRIMARY KEYポリシーの設計基準に従ってください。

PRIMARY KEY列の値は変更できません。

CREATE LOOKUP TABLE ch9_err_pk (code VARCHAR(16) PRIMARY KEY, label VARCHAR(64));
INSERT INTO ch9_err_pk VALUES ('KR', '대한민국');

-- 失敗: PRIMARY KEY列はSETの対象外です。(ERR-02176)
UPDATE ch9_err_pk SET code = 'KO' WHERE code = 'KR';

キーを変更する場合は、既存行を削除し、新しいキーで再入力します。

未サポートの列型

TEXTCLOBBLOBBINARYはLOOKUP列に使用できません。 長い文字列はVARCHARで宣言し、原文の保持が必要ならLOGテーブルに分離します。

-- 失敗: 未サポートの列型です。(ERR-02173)
ALTER TABLE ch9_err_pk ADD COLUMN (memo TEXT);

JSONは一般列として使用できます。 使用範囲はJSON列とクエリを参照してください。

DROP TABLE ch9_err_pk;

メモリ上限

LOOKUPはディスクに永続保存されますが、クエリの実行経路はメモリです。 サーバー起動時に全行とインデックスをメモリへロードするため、使用量が上限を超えるとERR-01344が発生します。

この上限はVOLATILEテーブルと共有します。 設定名はVOLATILE_で始まりますが、LOOKUPも同じ上限に含まれるため、両タイプを併用する環境では合計で判断する必要があります。

SELECT NAME, VALUE FROM V$PROPERTY
 WHERE NAME = 'VOLATILE_TABLESPACE_MEMORY_MAX_SIZE';

SELECT * FROM V$STORAGE_DC_VOLATILE_TABLE;

上限に近づいたら、保持範囲の縮小や未使用のセカンダリインデックスの削除を行います。 大規模なマスターデータでは、インデックスとパフォーマンスの基準に従って他のテーブルタイプを検討してください。

複数行の変更範囲

一般述語のUPDATE/DELETEは、複数行に適用される場合があります。 実行前に同じ述語で対象数を確認し、一般述語のUPDATE/DELETEの仕様に従ってください。

LOOKUPのJSON PRIMARY KEYエラー

JSON列は一般列として使用できますが、PRIMARY KEYには宣言できません。 識別子を別のスカラー列に格納し、JSON列とクエリの型・パス規則に従ってください。

制約と注意事項

最終更新日