当前位置: 首页 > 知识库问答 >
问题:

为什么PG::UniqueViolation:错误:重复键值违反唯一约束?

柴衡
2023-03-14

我有一个模型Post,每次创建一个Post时,我都希望同时创建一个Moderation的新实例。

所以在邮政。rb我在保存后使用回调:创建仲裁,然后编写一个私有方法:

 ...
 include Reportable
 after_save :create_moderation

 private
 def create_moderation
    self.create_moderation!(blog: Blog.first)
 end

但当创建提案时,我会遇到以下错误:

PG::唯一违反:错误:重复的键值违反唯一约束"moderations_reportable"详细信息:键(reportable_type,reportable_id)=(Post,25)已经存在。:插入到"适度"("blog_id","reportable_type","reportable_id","created_at","updated_at","blog_type")值($1、2美元、3美元、4美元、5美元、6美元)返回“id”

以可报告的形式。rb我有:

  has_one :moderation, as: :reportable, foreign_key: "reportable_id", foreign_type: "reportable_type", class_name: "Moderation"

然后对可报告对象使用其他一些方法。

注意,当我在控制台中运行create方法时,这个问题不会发生。

编辑

  create_table "moderations", id: :serial, force: :cascade do |t|
    t.string "reportable_type", null: false
    t.string "reportable_id", null: false
    t.integer "blog_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "blog_type", null: false
    t.string "upstream_moderation", default: "unmoderate"
    t.index ["blog_id", "blog_type"], name: "moderations_blog"
    t.index ["reportable_type", "reportable_id"], name: "moderations_reportable", unique: true
  end



create_table "posts", id: :serial, force: :cascade do |t|
    t.text "title", null: false
    t.text "body", null: false
    t.integer "feature_id", null: false
    t.integer "author_id"
    t.integer "scope_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "post_votes_count", default: 0, null: false
    t.index ["body"], name: "post_body_search"
    t.index ["created_at"], name: "index_posts_on_created_at"
    t.index ["author_id"], name: "index_posts_on_author_id"
    t.index ["feature_id"], name: "index_posts_on_feature_id"
    t.index ["proposal_votes_count"], name: "index_posts_on_post_votes_count"
    t.index ["title"], name: "post_title_search"
  end

共有3个答案

盖高畅
2023-03-14

看起来您已将唯一索引添加到数据库:

t.index ["reportable_type", "reportable_id"], name: "moderations_reportable", unique: true

使用唯一索引,您将只能有一条记录具有相同的reportable\u typereportable\u id。很可能您正在尝试为已具有缓和的可报告内容创建缓和。

仲璞瑜
2023-03-14

修复所有数据库的pkey序列:

ActiveRecord::Base.connection.tables.each do |table_name| 
  ActiveRecord::Base.connection.reset_pk_sequence!(table_name)
end
马高谊
2023-03-14

要解决此问题,我们必须告诉ActiveRecords查看表的顺序:

ActiveRecord::Base.connection.reset_pk_sequence!('table_name')

现在ActiveRecord应该具有正确的序列值,并且应该能够正确分配新id。

解决错误

PG::唯一违反:错误:重复的键值违反唯一约束"moderations_reportable"详细信息:键(reportable_type,reportable_id)=(Post,25)已经存在。:插入到"适度"("blog_id","reportable_type","reportable_id","created_at","updated_at","blog_type")值($1、2美元、3美元、4美元、5美元、6美元)返回“id”

“审核”表上发生错误。

从rails控制台运行以下修复程序

ActiveRecord::Base.connection.reset_pk_sequence!('moderations')

非常感谢。

 类似资料:
  • 我有这样的桌子: 我试图插入一些查询到另一个表(device_usage_test1)。这是我的表: 这是我的插入命令: 稍后,我将在device_usage_test1上创建一个插入查询。所以我的设备序列必须是唯一的。但是当我尝试用deviceserial (unique)插入时。它显示错误:< code >错误:重复的键值违反了唯一约束“device _ usage _ device seri

  • 我有两个表通知和消息。 Message.java 我的用例是——我将创建一条具有特定描述和开始时间的消息。如果我再次收到相同的消息,我应该能够更新结束时间。MessageId在方法generateMessageId下单独计算,因为这将作为一个标识符来查找消息是否已经保存。如果是,我将更新消息。它对第一条消息很有效,但当我尝试用更新的endTime再次保存时,我得到了 错误:重复的键值违反了唯一约束

  • 我在创建应用程序时遇到了这个问题。因此,每当我添加第一条评论时,问题都不会出现,但当我第二次尝试时,我会收到此错误: 重复的键值违反了唯一约束“tripplanner_discussion_author_id_key”详细信息:键 (author_id)=(1) 已存在。 我试图把放到 models.py,但它根本没有帮助。 models.py views.py 更新 当我登录到另一个用户时,一个

  • 当并发客户机试图将数据插入子表时,我们面临唯一的约束冲突问题。 假设我们有1以下的表格。用户user_id、first_name、last_name。2.项目project_idproject_name和project_description。 两者都有着多对多的关系。 当两个客户端试图创建一个新用户时。假设client1创建了user1(id=aa1),子记录项目(id=1)。Client2还创

  • 这是我的stacktrace: 学生表: 学生实体:学生标识默认为自动递增 postgres控制台(这些学生由sql脚本创建): 在此处输入图像描述 我也尝试过这样生成,但这没有帮助 我用postgreql它似乎我有问题与id Generator,谢谢你的想法和答案

  • 我在django应用程序中创建了一个模型,并从pgadmin将数据填充到表中,但现在当我试图从应用程序创建记录时,它抛出了这个完整性错误: 重复的键值违反了唯一约束“packsapp_foo_pkey” 详细信息:键(id)=(4)已经存在。 这是models.py 我是否总是必须从应用程序本身插入数据? Views.py