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

时间:2011-03-16 16:36:44

标签: ruby-on-rails migration primary-key key

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

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

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

4 个答案:

答案 0 :(得分:47)

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

add_column :my_table, :id, :primary_key

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

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

set_primary_key "my_existing_column"

或者在更新版本的Rails中:

self.primary_key = "my_existing_column"

如果您已经拥有自动增量列并且无法将其用作主键,则可能会运气不佳。

答案 1 :(得分:4)

如果由于某种原因您创建了一个包含自定义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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这是一个现在需要成为具有主键的真实模型的连接表吗?如果是这样,最好的办法是创建新表并将数据复制到其中。