我正在尝试在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
有关这可能来自哪里的任何想法?
谢谢!
答案 0 :(得分:3)
如果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