ALTER TABLE lhm migration删除现有值

时间:2016-03-14 10:22:15

标签: mysql sql ruby-on-rails migration alter-table

require 'lhm'

class RenameField1ToField2ForTable < ActiveRecord::Migration
  def up
    Lhm.change_table :table do |m|
      m.ddl("ALTER TABLE %s CHANGE COLUMN field1 field2 FLOAT DEFAULT NULL AFTER field3" m.name)
    end
  end

  def down
    Lhm.change_table :table do |m|
      m.ddl("ALTER TABLE %s CHANGE COLUMN field2 field1 FLOAT DEFAULT NULL AFTER field3" m.name)
    end
  end
end

发生了什么:

  1. Rails-4.0:rake db:migrate
  2. Field已成功重命名。
  3. 所有现有字段值都会被删除,为什么?有什么想法吗?
  4. 编辑:

    • 旧数据类型为float(11)
    • MYSQL 5.6

3 个答案:

答案 0 :(得分:4)

我强烈建议您使用LHM提供的方法来模仿Rails中的方法(如果您打算使用LHM):

Lhm.change_table(:users) do |m|
  m.change_column(:old_column, :float)
  m.rename_column(:old_column, :new_column)
end

如果您查看方法定义,您会看到LHM正在MODIFY执行CHANGE change_columnCHANGE rename_column ViewController 1}}。

官方文件:

change_column: https://docs.omniref.com/ruby/gems/lhm/2.2.0/symbols/Lhm::Migrator/change_column?d=415590290&n=0#

rename_column:https://docs.omniref.com/github/soundcloud/lhm/2.2.0/symbols/Lhm::Migrator/rename_column?d=409846811&n=4#

答案 1 :(得分:0)

你可以像这样进行直接轨道迁移:

def change
  rename_column :table_name, :old_column, :new_column
end

我从未使用过lhm,所以这可能不可能?

如果已在数据库中指定了当前SQL语句中的“FLOAT DEFAULT NULL”,则可能不需要它。

希望有所帮助。

答案 2 :(得分:0)

将1st_name重命名为temporary_name,然后将2nd_name重命名为1st_name,然后从temporary_name重命名为2nd_name