交换表
有时你需要把一张桌子换成另一张。例如,当在一个非常大的表中迁移数据时,最好创建一个表的副本,然后在后台将数据插入和迁移到这个新表中。
假设您想用“events_for_migration”交换表“events”。在这种情况下,你需要遵循3个步骤:
- 将“events”重命名为“events_temporary”
- 将"events_for_migration"重命名为"events"
- 将events_temporary重命名为events_for_migration
控件允许您这样做rename_table
方法:
rename_table:事件,: events_temporaryrename_table: events_for_migration,:事件rename_table: events_temporary,: events_for_migration
这不需要任何停机时间,只要3rename_table
类中执行调用相同数据库事务。Rails默认使用数据库事务进行迁移,但如果没有,你需要手动启动一个:
事件.事务做rename_table:事件,: events_temporaryrename_table: events_for_migration,:事件rename_table: events_temporary,: events_for_migration结束
曾经交换过你必须重置新表的主键。对于PostgreSQL,您可以使用reset_pk_sequence !
方法如下:
reset_pk_sequence !(“事件”)
然而,对于MySQL,你需要运行以下命令:
量=事件.摘下(“合并(MAX (id), 1)”).第一个执行ALTER TABLE events AUTO_INCREMENT =# {量}"
重置主键失败将导致新创建的行以ID值1开始。根据现有数据,这可能导致弹出重复的键约束,从而阻止用户创建新数据。