これはOracleのバグです。
NOT NULL
の両方を含む列を追加することでトリガーされます 制約とDEFAULT
既存のテーブルの値。
列をすばやく追加するために、Oracle11gはデフォルト値をデータディクショナリに格納します。オラクルはこれを「列の最適化の追加」と呼んでいます。
これは、すべてのテーブル行にデフォルト値を書き込むよりも高速です。クエリエンジンは、テーブル行のNULLをデータディクショナリのデフォルト値に置き換えることになっています。残念ながら、これに関連するいくつかのバグがあります。あなたは次のインスタンスのようです:
次のように、どの列が追加されたかを確認できます:
select owner, object_name, name
from dba_objects, col$
where bitand(col$.PROPERTY,1073741824)=1073741824
and object_id=obj#;
私たちの場合、SELECT FOR UPDATE
に対して誤った結果を返す別のバグに悩まされていました。 。
パラメータ_add_col_optim_enabled=FALSE
を設定します この「最適化」をオフにします。または、これらのバグが解決された新しいバージョンのOracleにアップグレードできる場合もあります。
上記のパラメータをアップグレードまたは設定しても、破損している既存のテーブルは修正されません。そのテーブルを再作成する必要があります。