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

Rel mengubah jenis kolom dan memperbarui nilai kolom

Anda dapat melakukannya sekaligus dengan cukup mudah menggunakan klausa MENGGUNAKAN ALTER TABEL :

Pemeran tipe SQL sederhana akan meninggalkan Anda dengan string 'true' dan 'false' jadi Anda ingin menambahkan MENGGUNAKAN. Saya akan melewati AR dan melakukannya dengan tangan:

connection.execute(%q(
  alter table users
  alter column active
  type text
  using case when active then 'active' else 'inactive' end
))

Bagian penting bagi Anda adalah using case ... bagian di akhir. Anda dapat menggunakannya bersama dengan change_column AR-ish biasa hal-hal dengan menipu AR agar melakukan Hal yang Benar:

class ChangeColumnTypeInUsers < ActiveRecord::Migration
  def up
    change_column :users, :active, "text using case when active then 'active' else 'inactive' end"
  end

  def down
    change_column :users, :active, "boolean using active = 'active'"
  end
end

Perhatikan bahwa saya menggunakan text sebagai tipe kolom. Rel akan menggunakan varchar(255) di dalam database ketika Anda mengatakan :string tanpa batas, itu tidak ada gunanya dengan PostgreSQL karena menangani penyimpanan untuk semua jenis string hampir sama secara internal , batasan panjang pada char(n) dan varchar(n) sebenarnya membuatnya lebih mahal untuk digunakan daripada text . Maka hanya waktu :string masuk akal dengan PostgreSQL adalah ketika Anda memiliki alasan untuk memasukkan :limit tertentu (dan kemudian text kolom dengan CHECK batasan panjang akan lebih masuk akal tetapi AR terlalu bodoh untuk mengetahui tentang hal-hal "lanjutan" seperti CHECK kendala).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Migrasikan data SPASIAL dari Oracle ke Postgresql

  2. Postgres - Berfungsi untuk mengembalikan persimpangan 2 ARRAY?

  3. SQLAlchemy:memfilter nilai yang disimpan dalam daftar bersarang dari bidang JSONB

  4. Docker &Postgres:Gagal mengikat alamat tcp 0.0.0.0:5432 yang sudah digunakan

  5. Bagaimana cara MEMBERIKAN SEMUA HAK ISTIMEWA pada SEMUA VIEWS dalam satu pernyataan?