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

null不可能な列を既存のテーブルに追加すると失敗します。 value属性は無視されていますか?

    簡単な答え

    列の作成時にnull以外の制約を追加する場合、「value」属性は機能しません(これは、ドキュメント )。生成されたSQLは実行できません。

    回避策

    質問で説明されている回避策は、進むべき道です。結果のSQLは次のようになります。

    1. 列を追加

      ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
      
    2. すべての行でnull以外の値に設定します

      UPDATE table SET abstract_trimmed = 'No text';
      
    3. NOTNULL制約を追加します

      ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
      

    なぜですか?

    列のデフォルトは、INSERTを使用して列にのみ挿入されます 。 「value」タグはそれを行いますが、 列が追加されます。 Liquibaseは、NOT NULLを使用して、1つのステップで列を追加しようとします 制約があります:

    ALTER TABLE layer ADD abstract_trimmed VARCHAR(455) NOT NULL;
    

    ...これは不可能です テーブルにすでに行が含まれている場合。賢くないだけです。

    代替ソリューション

    PostgreSQL 8.0以降(今ではほぼ永久に)、代替手段は、null以外のDEFAULTを使用して新しい列を追加することです。

    ALTER TABLE layer
    ADD COLUMN abstract_trimmed varchar(455) NOT NULL DEFAULT 'No text';
    

    マニュアル:



    1. Oracle SQL:4倍の結果とデータを生成するSQLクエリが正しく順序付けられない

    2. あるコンピュータから別のコンピュータへのmysqlデータベースのコピー

    3. 階層データ全体でのMySQLクエリの最適化

    4. データベースMySQLの作成の「パスワードで識別」