Rails PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey" 翻译结果如下: Rails PG::UniqueViolation:错误:重复键值违反了唯一约束"table_pkey"。

12 浏览
0 Comments

Rails PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey" 翻译结果如下: Rails PG::UniqueViolation:错误:重复键值违反了唯一约束"table_pkey"。

我为项目的数据库创建了类似于 JSON 备份的东西,然后像这样填充它:\nModel.find_or_initialize_by(:id => h[\"id\"]).update(h)}\n其中 h 是一个实例的模型属性的哈希。\n记录实际上被创建了,但当我想创建一个新的记录时,Rails 抛出以下错误:\nPG::UniqueViolation: ERROR: duplicate key value violates unique constraint \"table_pkey\"\n我做错了什么?这对于所有使用脚手架创建的模型都发生了,这里以迁移为例:\n

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

0
0 Comments

Rails PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey"问题的出现原因是在使用Rails时,对于某个表的主键(id)采用了自增的顺序整数值作为标识。当数据库在为新记录分配id时,会从列表中取下一个数字并分配给该记录。假设数据库的id序列当前为3,而导入的记录的id分别为4、37和143025。当向数据库插入新记录时,数据库表示id为3,一切正常,序列现在为4。然后再插入一条记录,数据库表示id为4。尝试插入,但数据库中已经存在一个id为4的记录,因此出现了PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey"错误。

解决该问题的几种可能方法如下:

1. 在导入数据后,将数据库的id序列更改为大于导入的最大id的值。这种方法可能有点取巧,但是有效。可以使用Postgres手动更改序列的方法来实现这一点。

2. 在导入项时,避免硬编码id。这种方法比较复杂,需要对导入过程进行修改。

3. 将数据库的主键由整数id改为uuid。这是一种架构性的改变,如果应用程序还在开发阶段,这是最佳解决方案,但如果应用程序已经上线,这个改变可能会比较困难。

4. 使用适当的数据库备份系统而不是自己构建的方法。可以使用pg_dump等工具来进行数据库备份。

以上是解决Rails PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "table_pkey"问题的几种可能方法。根据具体情况选择合适的解决方案来解决该问题。

0