交换表

有时你需要把一张桌子换成另一张。例如,当在一个非常大的表中迁移数据时,最好创建一个表的副本,然后在后台将数据插入和迁移到这个新表中。

假设您想用“events_for_migration”交换表“events”。在这种情况下,你需要遵循3个步骤:

  1. 将“events”重命名为“events_temporary”
  2. 将"events_for_migration"重命名为"events"
  3. 将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开始。根据现有数据,这可能导致弹出重复的键约束,从而阻止用户创建新数据。

Baidu
map