Ошибка при переименовании столбца при миграции в рельсы - PullRequest
2 голосов
/ 13 февраля 2011

Я пытаюсь запустить миграцию в 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 ]

3 голосов
/ 13 февраля 2011

С MySQL документация

Если ALTER TABLE умирает со следующим ошибка, проблема может быть в том, что MySQL разбился во время более ранней ALTER TABLE операция и есть старая таблица по имени A-xxx или B-xxx, лежащие вокруг:

Ошибка при переименовании './database/name.frm' в «./database/B-xxx.frm» (код ошибки: 17) В этом случае перейдите к данным MySQL каталог и удалите все файлы, которые иметь имена, начинающиеся с A- или B-. (Вы можете переместить их в другое место вместо того, чтобы удалять их.)

1 голос
/ 22 июля 2013

Я исправил это, убрав ограничения внешнего ключа в таблице, затем переименовав столбец, а затем воссоздав ограничение внешнего ключа.

Чтобы удалить ограничение внешнего ключа:

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

Не знаю, почему MySQL иногда выдает эту ошибку ... Должен сказать, что у меня никогда не возникало таких странных проблем, как эта, на PostgreSQL.

1 голос
/ 13 февраля 2011

Изменение столбцов id в mysql немного сложно, так как все FK должны иметь одинаковый тип данных. Можете ли вы проверить, что все FK, которые у вас есть для этого идентификатора, являются int (11).

Если это не поможет, вставьте DDL пользователей и любые связанные таблицы.

0 голосов
/ 21 декабря 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...