【问题标题】:Rails PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey"Rails PG::UniqueViolation:错误:重复键值违反唯一约束“table_pkey”
【发布时间】:2021-01-22 17:50:25
【问题描述】:

我为我的项目数据库创建了类似 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

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord


    【解决方案1】:

    根据迁移,您正在为您的表使用顺序整数 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 2021-02-11
      • 2015-03-24
      • 2020-02-15
      • 2016-07-27
      • 2011-10-17
      • 2012-03-03
      相关资源
      最近更新 更多