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 4
、37
和 143025
。向数据库中插入一条新记录,数据库显示 id 为 3
,一切正常,序列现在为 4
。插入另一个,数据库说 id 是 4
。试图插入它,但数据库中已经有一个 4
。
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey"
一些可能的解决方案:
- 导入后,将数据库id序列更改为比导入的最大id大的值。 (hacky,但有效)Postgres manually alter sequence
- 导入项目而不对其 ID 进行硬编码。 (复杂)
- 更改您的数据库以使用 uuid-s 而不是整数 id-s(架构更改,如果应用程序是实时的则困难,如果您仍在开发中则最佳解决方案)
- 使用合适的数据库备份系统,而不是自己构建。 pg_dump
我为我的项目数据库创建了类似 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 4
、37
和 143025
。向数据库中插入一条新记录,数据库显示 id 为 3
,一切正常,序列现在为 4
。插入另一个,数据库说 id 是 4
。试图插入它,但数据库中已经有一个 4
。
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey"
一些可能的解决方案:
- 导入后,将数据库id序列更改为比导入的最大id大的值。 (hacky,但有效)Postgres manually alter sequence
- 导入项目而不对其 ID 进行硬编码。 (复杂)
- 更改您的数据库以使用 uuid-s 而不是整数 id-s(架构更改,如果应用程序是实时的则困难,如果您仍在开发中则最佳解决方案)
- 使用合适的数据库备份系统,而不是自己构建。 pg_dump