sql >> データベース >  >> RDS >> Oracle

このOracleDROPCOLUMNが別の列のデフォルト値を変更するのはなぜですか?

    これは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にアップグレードできる場合もあります。

    上記のパラメータをアップグレードまたは設定しても、破損している既存のテーブルは修正されません。そのテーブルを再作成する必要があります。




    1. ツリー階層を取得するためのCTE再帰

    2. MySqlテーブル内にチャットメッセージを保存する

    3. 既存のテーブルに主キーを持つ列を追加する

    4. MariaDBでのDAYNAME()のしくみ