Rails PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey"

Rails PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey"

我为我的项目数据库创建了类似 JSON 的备份,然后我像这样填充它

Model.find_or_initialize_by(:id => h["id"]).update(h)}

作为一个实例的模型属性的散列。

记录已有效创建,但当我要创建新记录时,rails出现此错误

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "table_pkey"

我做错了什么?所有使用脚手架创建的模型都会发生这种情况,这里以迁移为例。

class CreateModel < ActiveRecord::Migration[6.1]
  def change
    create_table :models do |t|
      t.string :attribute1
      t.string :attribute2
      t.string :attribute3

      t.timestamps
    end
  end
end

根据迁移,您正在为 table 使用顺序整数 ID。如果您允许数据​​库为您分配 id,这就足够了。每次有新记录进入时,数据库都会获取列表中的下一个数字并将其分配给该记录(此处简化)。

假设数据库 ID 序列当前位于 3,并且您导入的记录具有 ID 437143025。向数据库中插入一条新记录,数据库显示 id 为 3,一切正常,序列现在为 4。插入另一个,数据库说 id 是 4。试图插入它,但数据库中已经有一个 4

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "table_pkey"

一些可能的解决方案:

  1. 导入后,将数据库id序列更改为比导入的最大id大的值。 (hacky,但有效)Postgres manually alter sequence
  2. 导入项目而不对其 ID 进行硬编码。 (复杂)
  3. 更改您的数据库以使用 uuid-s 而不是整数 id-s(架构更改,如果应用程序是实时的则困难,如果您仍在开发中则最佳解决方案)
  4. 使用合适的数据库备份系统,而不是自己构建。 pg_dump