IntegrityError重复键值违反了唯一约束 – django / postgres

我正在跟进一个问题,就是我之前询问过的一个问题,在这个问题中,我试图寻求从愚蠢/写得不好的mysql查询到postgresql的转换。 我相信我成功了。 无论如何,我正在使用手动从mysql数据库移动到postgres数据库的数据。 我使用的查询如下所示:

""" UPDATE krypdos_coderound cru set is_correct = case when t.kv_values1 = t.kv_values2 then True else False end from (select cr.id, array_agg( case when kv1.code_round_id = cr.id then kv1.option_id else null end ) as kv_values1, array_agg( case when kv2.code_round_id = cr_m.id then kv2.option_id else null end ) as kv_values2 from krypdos_coderound cr join krypdos_value kv1 on kv1.code_round_id = cr.id join krypdos_coderound cr_m on cr_m.object_id=cr.object_id and cr_m.content_type_id =cr.content_type_id join krypdos_value kv2 on kv2.code_round_id = cr_m.id WHERE cr.is_master= False AND cr_m.is_master= True AND cr.object_id=%s AND cr.content_type_id=%s GROUP BY cr.id ) t where t.id = cru.id """ % ( self.object_id, self.content_type.id) ) 

我有理由相信这个效果很好。 但是,这导致了一个新的问题。 试图提交时,我从django得到一个错误,指出:

 IntegrityError at (some url): duplicate key value violates unique constraint "krypdos_value_pkey" 

我已经看了几个在这里发布的回复,我还没有find解决我的问题(尽pipe相关的问题已经提出了一些有趣的阅读)。 我在我的日志中看到这一点,这很有趣,因为我从来没有明确地调用insert-django必须处理它:

  STATEMENT: INSERT INTO "krypdos_value" ("code_round_id", "variable_id", "option_id", "confidence", "freetext") VALUES (1105935, 11, 55, NULL, E'') RETURNING "krypdos_value"."id" 

但是,试图运行该结果中的重复键错误。 实际的错误是在下面的代码中引发的。

  # Delete current coding CodeRound.objects.filter(object_id=o.id,content_type=object_type,is_master=True).delete() code_round = CodeRound(object_id=o.id,content_type=object_type,coded_by=request.user,comments=request.POST.get('_comments',None),is_master=True) code_round.save() for key in request.POST.keys(): if key[0] != '_' or key != 'csrfmiddlewaretoken': options = request.POST.getlist(key) for option in options: Value(code_round=code_round,variable_id=key,option_id=option,confidence=request.POST.get('_confidence_'+key, None)).save() #This is where it dies # Resave to set is_correct code_round.save() o.status = '3' o.save( 

我已经检查了序列等,他们似乎是为了。 在这一点上,我不知道该怎么办 – 我认为这是在Django的结束,但我不知道。 任何反馈将不胜感激!

这发生在我身上 – 事实certificate,你需要在Postgres中重新同步你的主键字段 – 在这里查看我的post – 关键是SQL语句:

 SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename)+1) 

它似乎是MySQL和SQLite之间的行为已知的差异(他们更新下一个可用的主键,即使插入一个明确的ID对象)后端和其他后端像Postgres,甲骨文,…(他们不) 。

有一张票据描述相同的问题 。 即使它被closures为无效,它提供了一个提示,即有一个Djangopipe理命令来更新下一个可用的密钥。

要显示SQL更新应用程序MyApp的所有下一个ID:

 python manage.py sqlsequencereset MyApp 

为了使语句执行,可以将其作为dbshel​​lpipe理命令的input提供。 对于bash,你可以键入:

 python manage.py sqlsequencereset MyApp | python manage.py dbshell 

pipe理命令的优点是将底层数据库后端提取出来,所以即使稍后迁移到不同的后端,它也可以工作。

除了zapphods回答:

在我的情况下,索引确实是不正确的,因为我已经删除了所有的迁移,而且数据库在开发时大概是10-15倍,因为我还没有进行任何迁移。

我在finished_product_template_finishedproduct_pkey上收到了一个IntegrityError错误

重新编制表并重新启动runserver:

我正在使用pgadmin3和任何索引是不正确的,并抛出重复的关键错误我导航到constraints和重新索引。

在这里输入图像说明

然后重新编制索引。

在这里输入图像说明

如果您手动复制数据库,则可能遇到此处所述的问题 。

我遇到了这个错误,因为我以错误的方式将额外的parameter passing给save方法。

对于任何遇到此问题的人,请尝试强制UPDATE:

 instance_name.save(..., force_update=True) 

如果你得到一个错误,你不能同时传递force_insertforce_update ,你可能会像我一样错误地传递一些自定义参数。

我遇到过同样的问题。 我在我的“库存”应用程序中有一个现有的表,我想添加新的logging在Djangopipe理员,我得到这些消息:

重复键值违反唯一约束“inventory_part_pkey”详细信息:键(part_id)=(1)已经存在。

正如前面提到的那样,运行下面的代码来生成一个SQL命令来重置id -s:

 python manage.py sqlsequencereset inventory 

在我的情况python manage.py sqlsequencereset MyApp | python manage.py dbshell python manage.py sqlsequencereset MyApp | python manage.py dbshell无法正常工作

  • 所以我复制了生成的SQL语句。
  • 然后打开PostgreSQL的pgAdmin并打开我的数据库。
  • 点击6.图标(执行任意SQL查询)
  • 复制了所产生的声明。

在我的情况是这样的:

开始; SELECT setval(pg_get_serial_sequence(''inventory_signup'','id'),coalesce(max(“id”),1),max(“id”)IS NOT null)FROM“inventory_signup”; SELECT setval(pg_get_serial_sequence(''inventory_supplier'','id'),coalesce(max(“id”),1),max(“id”)is not null)FROM“inventory_supplier”; 承诺;

执行它与F5。

这固定了我所有的表格,并最终添加新的logging到最后不再试图将其添加到id = 1。