2011-03-16 46 views
21

我创建了一个没有主键的表(:id => false),但现在它已经回来咬我的屁股。我如何在rails中追溯添加主键到我的表中?

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

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

+1

您正在使用哪种数据库引擎? – Augusto 2011-03-16 16:40:42

+0

请务必测试您在测试系统上所做的任何更改,而不是生产上的更改! – 2011-03-16 16:44:00

+0

sqlite正在开发中,但PostgreSQL正在开发中 – 2011-03-16 16:48:27

回答

1

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

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

+0

是否有轨道的做法呢? – 2011-03-16 16:51:07

+0

或者SQL语句是否可以用于sqlite和PostgreSQL? – 2011-03-16 16:51:36

0

这是一个连接表,现在需要成为一个真正的主键模型?如果是这样,你最好的选择是创建新表并将数据复制到其中。

+0

将数据传输到新表格的最佳方法是什么? – 2011-03-16 16:53:51

35

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

add_column :my_table, :id, :primary_key

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

如果您已经拥有一个自动递增列,你真的想使用该列作为主键,只需添加以下模型:

set_primary_key "my_existing_column"

或者在较新版本的扶手:

self.primary_key = "my_existing_column"

在你已经有一个自动递增列,你不能使用它作为主键,你可能是出于运气的情况下。

+0

谢谢。非常有用的信息。 – 2013-05-30 14:36:20

+1

看起来像set_primary_key不存在了https://github.com/composite-primary-keys/composite_primary_keys/issues/83 – frankpinto 2015-09-08 06:26:35

2

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