Ruby on rails 还原活动记录架构中的主键

Ruby on rails 还原活动记录架构中的主键,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,不知怎的,我的模式以以下id列结束: create_table "tables", :id => false, :force => true do |t| t.integer "id", :null => false # other fieds end 这是列上的信息(请注意,primary为false): [4]pry(main)>Table.columns.first =

不知怎的,我的模式以以下id列结束:

create_table "tables", :id => false, :force => true do |t|
    t.integer  "id",                                         :null => false
    # other fieds
  end
这是列上的信息(请注意,primary为false):

[4]pry(main)>Table.columns.first
=> #
因此,每当我尝试保存新记录时,都会出现此错误:
ActiveRecord::StatementInvalid:PG::Error:Error:column“id”中的null值违反了非null约束


还原我的主键的最佳方法是什么?

Rails迁移无法以本机方式处理此问题-您需要使用设置主键、创建缺少的序列、将序列移动到最新的“id”值(如果存在)并将序列nextval指定为默认值的SQL来执行:

execute("ALTER TABLE tables ADD PRIMARY KEY (id);")
execute("CREATE sequence tables_id_seq;")

# skip this next line if you know that no rows exist yet
execute("SELECT setval('tables_id_seq', (SELECT MAX(id) FROM tables));")    

execute("ALTER TABLE tables ALTER id SET DEFAULT nextval('tables_id_seq');")

Rails迁移无法以本机方式处理此问题-您需要使用SQL来设置主键、创建缺少的序列、将序列移动到最新的“id”值(如果存在),并将序列nextval指定为默认值:

execute("ALTER TABLE tables ADD PRIMARY KEY (id);")
execute("CREATE sequence tables_id_seq;")

# skip this next line if you know that no rows exist yet
execute("SELECT setval('tables_id_seq', (SELECT MAX(id) FROM tables));")    

execute("ALTER TABLE tables ALTER id SET DEFAULT nextval('tables_id_seq');")

你能详细解释一下这是怎么发生的吗?您创建了一个没有
id
的表,然后想添加一个?我不知道这是怎么发生的。我查看了迁移过程,但它没有明确设置此表的id字段。现在您想删除它吗?此外,您可能想重新考虑使用表名
tables
,因为它可能位于postgres的保留关键字中。也许有经验的人会对这个问题说得更多“表”这个名字只是这个问题的假名字。你能详细解释一下这是怎么发生的吗?您创建了一个没有
id
的表,然后想添加一个?我不知道这是怎么发生的。我查看了迁移过程,但它没有明确设置此表的id字段。现在您想删除它吗?此外,您可能想重新考虑使用表名
tables
,因为它可能位于postgres的保留关键字中。也许有经验的人会对这个问题多说些什么“桌子”这个名字只是这个问题的假名字。它说PG::Error:Error:relation“tables_id_seq”已经存在。@DavidNix:Aha,所以它在某一点上一定是主键。在这种情况下,只需跳过第二行
execute(“创建序列…”
.Dang)。它说PG::Error:Error:relation“tables\u id\u seq”已经存在。@DavidNix:Aha,所以它一定在某一点上是主键。在这种情况下,只需跳过第二行
execute(“创建序列…”
)。