0

不知何故,我的架构以这个 id 列结束:

create_table "tables", :id => false, :force => true do |t|
    t.integer  "id",                                         :null => false
    # other fieds
  end

这是列上的信息(注意主要是假的):

[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

恢复主键的最佳方法是什么?

4

1 回答 1

4

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');")
于 2013-04-03T21:43:41.780 回答