不知何故,我的架构最终得到了这个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::ConnectionAdapters::PostgreSQLColumn:0x007f98d06cc0f8
@coder=nil,
@default=nil,
@limit=nil,
@name="id",
@null=false,
@precision=nil,
@primary=false,
@scale=nil,
@sql_type="integer",
@type=:integer>
每当我尝试保存新记录时都会收到此错误:
ActiveRecord::StatementInvalid: PG::Error: ERROR: null value in column "id" violates not-null constraint
恢复主键的最佳方法是什么?
答案 0 :(得分:2)
Rails迁移无法本机处理 - 您需要将execute
与设置主键的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');")