PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Gagal menambahkan kolom yang tidak dapat dibatalkan ke tabel yang ada. Apakah atribut nilai diabaikan?

Jawaban singkat

Atribut "value" tidak akan berfungsi jika Anda menambahkan batasan bukan-null pada saat pembuatan kolom (ini tidak disebutkan dalam dokumentasi ). SQL yang dihasilkan tidak akan dapat dieksekusi.

Solusi

Solusi yang dijelaskan dalam pertanyaan adalah cara yang harus ditempuh. SQL yang dihasilkan akan menjadi:

  1. Tambahkan kolom

    ALTER TABLE layer ADD COLUMN abstract_trimmed varchar(455);
    
  2. Setel ke nilai bukan nol untuk setiap baris

    UPDATE table SET abstract_trimmed = 'No text';
    
  3. Tambahkan batasan NOT NULL

    ALTER TABLE layer ALTER COLUMN abstract_trimmed SET NOT NULL;
    

Mengapa?

Default kolom hanya dimasukkan ke dalam kolom dengan INSERT . Tag "nilai" akan melakukannya untuk Anda, tetapi setelah kolom ditambahkan. Liquibase mencoba menambahkan kolom dalam satu langkah, dengan NOT NULL kendala di tempat:

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

... yang tidak mungkin ketika tabel sudah berisi baris. Itu tidak cukup pintar.

Solusi alternatif

Sejak PostgreSQL 8.0 (jadi hampir selamanya sekarang) alternatifnya adalah menambahkan kolom baru dengan DEFAULT non-null :

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

Manual:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nilai sisipkan Postgres dari sisipan di tabel lain

  2. akankah postgres benar-benar memperbarui file halaman ketika semua bidang sama sebelum dan sesudah pembaruan?

  3. Kelompokkan Menurut dan tambahkan kolom

  4. Autocommit di Flask-SQLAlchemy

  5. Cari di beberapa tabel dan juga tampilkan nama tabel di baris yang dihasilkan