如何在rails中追溯性地将主键添加到我的表中?

Jon*_*hiu 29 migration ruby-on-rails key primary-key

我创建了一个没有主键的表(:id => false),但现在又回来咬了我的屁股.

我的应用程序已经投入生产,我不能只删除它并重新创建另一个.

有没有办法运行迁移以向我的表添加另一个自动增量主键列?

Rya*_*yan 48

在迁移中添加主键的命令是:

add_column :my_table, :id, :primary_key

但是,您的问题的措辞表明您的表已经有一个自动增量列.除非我弄错了,否则有几个DBMS不允许在表上使用多个自动增量列.

如果您已经拥有自动增量列并且实际上想要将该列用作主键,只需将以下内容添加到模型中:

set_primary_key "my_existing_column"

或者在更新版本的Rails中:

self.primary_key = "my_existing_column"

如果您已经有一个自动增量列,并且您不能将其用作主键,那么您可能会失败.

  • 看起来 set_primary_key 不再存在 https://github.com/composite-primary-keys/composite_primary_keys/issues/83 (2认同)

And*_*rew 6

如果由于某种原因创建了带有自定义id字段的表,但是忘记了将其设置id为主键,则需要运行迁移来创建主键约束。以下内容已针对PostgreSQL数据库进行了测试:

class AddPrimaryKeyConstraintToFoobars < ActiveRecord::Migration
  def up
    execute "ALTER TABLE foobars ADD PRIMARY KEY (id);"
  end

  def down
    execute "ALTER TABLE foobars DROP CONSTRAINT foobars_pkey;"
  end
end
Run Code Online (Sandbox Code Playgroud)


Ste*_*man 1

我知道在 mySQl 中您可以添加一个具有默认增量值的列。如果添加的话,每一行都将有一个唯一的 int 值(并且任何新行将获得比最后添加的行大 1 的 int 值)

您可以添加此列并将其设置为主键。