Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Rails将主id更改为64位bigint_Mysql_Ruby On Rails_Ruby - Fatal编程技术网

Mysql Rails将主id更改为64位bigint

Mysql Rails将主id更改为64位bigint,mysql,ruby-on-rails,ruby,Mysql,Ruby On Rails,Ruby,我正在使用rails和mysql2适配器。我想将所有主ID和外键更改为64位整数,而不是生产数据库中的默认32位 这是可能的,还是我必须删除数据库、更改结构并再次导入数据 如果有一种方法可以在不删除数据库的情况下完成此操作,即使这是一种黑客行为,也很高兴知道。虽然ActiveRecord不支持此操作,但您可以使用execute class UpdateUserIdLimit < ActiveRecord::Migration def up # PostgreSQL ex

我正在使用rails和mysql2适配器。我想将所有主ID和外键更改为64位整数,而不是生产数据库中的默认32位

这是可能的,还是我必须删除数据库、更改结构并再次导入数据


如果有一种方法可以在不删除数据库的情况下完成此操作,即使这是一种黑客行为,也很高兴知道。

虽然ActiveRecord不支持此操作,但您可以使用
execute

class UpdateUserIdLimit < ActiveRecord::Migration
  def up
    # PostgreSQL
    execute('ALTER TABLE users ALTER COLUMN id SET DATA TYPE BIGINT')
    # MySQL
    execute('ALTER TABLE users MODIFY COLUMN id BIGINT(8) NOT NULL AUTO_INCREMENT')
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

另外,从Rails 5.1开始,默认情况下主键将是
BIGINT

Rails 5.1已经为迁移添加了
BIGINT
类型,您可以执行以下操作:

change_column :users, :id, :bigint
资料来源:

如果我这样做,
id
还会有自动递增选项吗?有没有办法用
change\u column
来实现这一点?没有,看起来不像。谢谢,我很快就会尝试。如果这将被大量使用,可能值得制作一个简单的包装器,它可以可靠地完成,而不是依赖大量原始SQL,类似于
change\u id\u column\u type
。关于Rails 5.1的有趣说明。在转换过程中,对数据库的任何大规模更改都会导致停机。对于需要64位整数的表,其中可能包含数亿条记录,这种转换可能需要非常非常长的时间。您需要运行测试,看看这对您的正常运行时间有多大影响。@tadman谢谢,在转换过程中,我们将有一个后备数据库,并在切换回主数据库之前同步所有新数据。真正的问题是如何将所有相关外键更改为
bigint
(约束本身)。您需要删除现有约束,更改列类型,然后再次添加约束。这是将来的情况,但我认为至少Rails 4.2还定义了
:bigint
,并且我能够在不必对外键约束做任何操作的情况下进行转换(删除并重新添加)。不确定原因。我尝试了此操作,但失败的原因是
Mysql2::Error:Field'id'没有默认值
请注意,忘记
autoincrement:true
选项会导致意外错误
change_column :users, :id, :bigint