sql >> Database teknologi >  >> RDS >> PostgreSQL

Skinner ændrer kolonnetype og opdaterer kolonneværdier

Du kan gøre det på én gang ganske nemt ved at bruge USING-sætningen af ​​ALTER TABEL :

En simpel SQL-type cast ville efterlade dig med strengene 'true' og 'false' så du ønsker at tilføje en USING. Jeg ville omgå AR og gøre det i hånden:

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

Den vigtige del for dig er using case ... del til sidst. Du kan bruge det sammen med den sædvanlige AR-ish change_column ting ved at narre AR til at gøre det rigtige:

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

Bemærk, at jeg bruger text som kolonnetype. Rails vil bruge varchar(255) inde i databasen, når du siger :string uden en grænse, det er ret meningsløst med PostgreSQL, da det håndterer lagringen for alle strengtyperne stort set det samme internt , længdebegrænsningerne på char(n) og varchar(n) gør dem faktisk dyrere at bruge end text . Derefter kun tid :string giver mening med PostgreSQL er, når du har en grund til at inkludere en specifik :limit (og derefter en text kolonne med en CHECK begrænsning af længden ville give mere mening, men AR er for dum til at vide om "avancerede" ting som CHECK begrænsninger).



  1. ORA-01097

  2. Hvilken SqlDbType knytter til varBinary(max)?

  3. MySQL - Sletning af nogle specifikke tabeller fra Big Database

  4. Hvordan bruger man LOAD DATA INFILE-sætning, når filen er en anden placering?