2015-04-27 4 views
3

Так что я ошибочно создал таблицу с полями, которые должны были быть NOT NULL.Изменение полей NOT NULL с полями NULL с использованием миграции

Мне нужно создать миграцию, чтобы изменить поля от NULLABLE до NOT NULL, но существуют некоторые строки, которые уже имеют значение NULL.

Могу ли я обновить эти строки и изменить поля? Я попытался это:

def change 
    change_column :countries, :effective_date, :date, :null => false, :default => Time.now 
    change_column :countries, :expiry_date, :date, :null => false, :default => Time.new(9999,12,31) 
    end 

Но это не удалось с ошибкой:

mysql2 :: Ошибка: Недопустимое использование значения NULL: ALTER TABLE

Есть идеи? Нужно работать как на mysql, так и на сервере sql.

+0

положить: NULL => ложным после дефолта и проверить, если он работает. –

+0

все равно получил ту же ошибку! – user3437721

+0

см. Ссылку http://viget.com/extend/adding-a-not-null-column-to-an-existing-table –

ответ

4

Сначала убедитесь, что нет NULL, а затем измените ограничение.

Вариант 1:

Country.where(effective_date: nil).update_all(effective_date: Time.now) 
Country.where(expiry_date: nil).update_all(expiry_date: Time.new(9999,12,31)) 
change_column :countries, :effective_date, :date, :null => false 
change_column :countries, :expiry_date, :date, :null => false 

Вариант 2:

change_column_null :countries, :effective_date, false, Time.now 
change_column_null :countries, :expiry_date, false, Time.new(9999,12,31) 
+0

первый способ дает эту ошибку: неправильное количество аргументов (2 для 1) C: в 'update_all '. Я считаю, что это не рекомендуется в рельсах 4. Второй способ не будет работать с SQL-сервером, как я его понимаю. – user3437721

+0

Я считаю, что вы правы в том, что первый метод устарел в рельсах 4. Почему вы думаете, что второй способ не будет работать? Вы можете делать в миграциях все, что вы можете сделать в рельсах. BTW Я проверил документацию change_column_null, и он принимает необязательный 4-й аргумент, я обновил ответ с ним. – makhan

+0

Это change_column_null не поддерживается комбинацией JRuby и SQL Server. Таким образом, миграции действительно не удались, когда мы запускали их в этой среде. – user3437721

Смежные вопросы