在rails中迁移期间重命名列时出错

时间:2011-02-12 22:50:20

标签: mysql ruby-on-rails migration

我正在尝试在rails中运行迁移以更改列的名称,但是我收到此错误:

Mysql::Error: Error on rename of './databasename/#sql-478_17b' to './databasename/zz_portal_users' (errno: 150): ALTER TABLE `zz_portal_users` CHANGE `user_id` `zz_user_id` int(11) DEFAULT NULL

以下是我尝试运行的迁移:

class RenameUsersIdToZzUsersIdInZzPortalUsers < ActiveRecord::Migration
  def self.up
    rename_column :zz_portal_users, :user_id, :zz_user_id
  end

  def self.down
    rename_column :zz_portal_users, :zz_user_id, :user_id
  end
end

有关这可能来自哪里的任何想法?

谢谢!

4 个答案:

答案 0 :(得分:3)

来自MySQL documentation

  

如果ALTER TABLE死于以下内容   错误,问题可能是MySQL   在早期的ALTER TABLE中崩溃   操作,有一张旧桌子   名字叫A-xxx或B-xxx:

     

重命名时出错   './database/name.frm'到   './database/B-xxx.frm'(错误代码:17)   在这种情况下,请转到MySQL数据   目录并删除所有文件   名字以A-或B-开头。   (你可能想把它们移到其他地方   而不是删除它们。)

答案 1 :(得分:1)

更改mysql中的id列有点棘手,因为所有FK必须具有相同的数据类型。你能检查一下你拥有的所有FK是否为int(11)。

如果这没有帮助,请粘贴用户的DDL和任何相关表格。

答案 2 :(得分:1)

我通过删除表上的外键约束,然后重命名列,然后重新创建外键约束来修复此问题。

删除外键约束:

ALTER TABLE <table_name> DROP FOREIGN KEY <constraint_name>;

不知道为什么MySQL有时会抛出这个错误...必须说我在PostgreSQL上没有像这样的奇怪问题。

答案 3 :(得分:0)

MySQL在外键约束下重命名列似乎有些问题。我们最终写完了

class RenameXsYToZ < ActiveRecord::Migration[5.2]
  def up
    remove_foreign_key :xs, :ys
    rename_column :xs, :y_id, :z_id
    add_foreign_key :xs, :ys, column: :z_id
  end
end