6

这看起来很简单,但我不确定出了什么问题。

我试图在我的 Rails 迁移中执行以下操作:

change_column :foo, :bar, :text, :limit => 16777215

我收到以下错误

Mysql::Error: BLOB/TEXT column 'bar' can't have a default value: ALTER TABLE `foo` CHANGE `bar` `email_contents` text(16777215) DEFAULT '' NOT NULL

我唯一能想到的是导致一个问题,这个 change_column 在我将列添加到 foo 后不久发生,并且必须首先将其从 type :string 更改为 type :text 。这些每个都来自自己的迁移脚本,如下所示:

add_column :foo, :bar, :string, :null => false

change_column :foo, :bar, :text

作为一个实验,我尝试更改第一个 change_column (change_column :foo, :bar, :text) 并发现这成功地改变了表格。不幸的是,我无法更改之前的任何一个迁移,只能在我们当前的实现中添加新的迁移,因此这在生产中不起作用。问题是,什么允许我更改列一次而不是两次?

更新尝试了第一个建议,但得到以下结果:

Mysql::Error: BLOB/TEXT column 'bar' can't have a default value: ALTER TABLE `foo` CHANGE `bar` `bar` text(16777215) DEFAULT ''
4

6 回答 6

12

尝试

change_column :foo, :bar, :text, :limit => 16777215, :default => nil, :null => true

于 2011-05-09T20:32:04.600 回答
3

万一有人遇到这篇文章并发现这很有用。我遇到了同样的问题,另一种避免它的方法是更改​​ mysql 配置,以便 sql-mode 不严格,即STRICT_TRANS_TABLES默认情况下不包括它。

于 2012-05-16T19:58:01.107 回答
1

您是否有其他迁移,其中:limit指定了:text该工作?

可能:text不接受 a :limit,并且它只是映射到特定的 MySQL 数据类型,如果我没看错的话。

Rails 迁移类型和 MySQL 数据类型的映射: http ://www.orthogonalthought.com/blog/index.php/2007/06/mysql-and-ruby-on-rails-datatypes/

MySQL TEXT 类型(没有提到 LIMIT,但我想不排除它:http: //dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

于 2011-05-09T20:35:40.900 回答
1

对我来说,这似乎是从 MySQL 5.5.x 升级到 5.6.x 的结果

注意:有人应该去阅读Semantic Versioning 2.0.0

我的解决方法很简单...

曾是

change_column :my_table, :my_column, :mediumtext #=> Migrations Explosion

change_column :my_table, :my_column, :mediumtext, default: nil #=> All good in the mysql 5.6.21 
于 2015-02-10T19:30:14.867 回答
0

试试这个:

change_column :foo, :bar, :text, :limit => 16777215, :null => true

使用时:null => false(如在旧迁移中),Rails 将 DEFAULT 位添加到 ALTER TABLE 语句中。但是,就像错误所说,TEXT 列不能有默认值。通过将其更改:null => true为新迁移,问题应该会消失。

于 2011-05-09T19:40:28.447 回答
0

这对我有用:

    change_column :delayed_jobs, :handler, :text, 
      limit: 16777215, null: true, default: nil

我必须添加default: nil,然后 Rails 是 OK 设置null: true,它删除了在早期迁移中定义的默认设置。

于 2014-11-04T23:04:16.433 回答