【问题标题】:Django: duplicate key value violates unique constraint with Postgresql not with SQlite -> why?Django:重复键值违反了 Postgresql 而不是 SQlite 的唯一约束 -> 为什么?
【发布时间】:2020-09-14 18:06:36
【问题描述】:

我刚刚使用 Postgresql 数据库部署了我的项目,但遇到了一个错误,违反了我的 sqlite 开发数据库所没有的唯一约束

/randomization_settings/edit/ 处的 IntegrityError 重复键值违反唯一约束“adm_bra_pkey” 详细信息:键 (bra_ide)=(1) 已存在。

我有一个表 (adm_bra) 预填充了 2 行。

我尝试在视图中使用 models.objects.create() 方法在代码中插入新行。

为什么这种情况发生在 postgresql 而不是 sqlite 数据库? 我尝试删除并重新启动 adm_bra 的序列,但它不起作用!

感谢帮助

编辑 我做了一些测试 首先我重新初始化了我的表

DELETE FROM adm_bra;
ALTER SEQUENCE adm_pro_pro_ide_seq RESTART WITH 1;
INSERT INTO adm_bra ("bra_ide","ran_st1","ran_st2","bra_00A_act","bra_00A_lib","bra_00B_act","bra_00B_lib","bra_00C_act","bra_00C_lib","bra_00D_act","bra_00D_lib","bra_log","bra_dat","pay_ide_id") 
VALUES (1,1,1,1,'HCQ+LPV/r',1,'HCQ+DRV/r',1,'LPV/r+TMS',1,'LPV/r+ATS','admin',now(),1);
INSERT INTO adm_bra ("bra_ide","ran_st1","ran_st2","bra_00A_act","bra_00A_lib","bra_00B_act","bra_00B_lib","bra_00C_act","bra_00C_lib","bra_00D_act","bra_00D_lib","bra_log","bra_dat","pay_ide_id") 
VALUES (2,2,1,1,'HCQ+LPV/r',1,'HCQ+DRV/r',1,'LPV/r+TMS',1,'LPV/r+ATS','admin',now(),1);

如果我尝试执行此代码,则会收到唯一约束错误:

Bras.objects.create(
                ran_st1 = 1, 
                ran_st2 = 1,
                bra_00A_act = 1, 
                bra_00A_lib = 'HCQ+LPV/r', 
                bra_00B_act = 1, 
                bra_00B_lib = 'HCQ+DRV/r', 
                bra_00C_act = 1, 
                bra_00C_lib = 'LPV/r+TMS', 
                bra_00D_act = None, 
                bra_00D_lib = None, 
                bra_00E_act = None, 
                bra_00E_lib = None, 
                bra_00F_act = None, 
                bra_00F_lib = None, 
                bra_00G_act = None, 
                bra_00G_lib = None, 
                bra_00H_act = None, 
                bra_00H_lib = None, 
                bra_00I_act = None, 
                bra_00I_lib = None, 
                bra_00J_act = None, 
                bra_00J_lib = None, 
                bra_dat = timezone.now(), 
                bra_log = 'admin', 
                pay_ide_id = 2
            )

但是,如果执行此代码,它会起作用:

b= Bras(           ran_st1 = 1,ran_st2 = 1,
                bra_00A_act = 1,
                bra_00A_lib = 'HCQ+LPV/r', 
                bra_00B_act = 1,
                bra_00B_lib = 'HCQ+DRV/r', 
                bra_00C_act = 1, 
                bra_00C_lib = 'LPV/r+TMS', 
                bra_00D_act = None, 
                bra_00D_lib = None, 
                bra_00E_act = None, 
                bra_00E_lib = None, 
                bra_00F_act = None, 
                bra_00F_lib = None, 
                bra_00G_act = None, 
                bra_00G_lib = None, 
                bra_00H_act = None, 
                bra_00H_lib = None, 
                bra_00I_act = None, 
                bra_00I_lib = None, 
                bra_00J_act = None, 
                bra_00J_lib = None, 
                bra_dat = timezone.now(), 
                bra_log = 'admin', 
                pay_ide_id = 2
            )
b.save()
Bras.objects.create(
                ran_st1 = 1, 
                ran_st2 = 1,
                bra_00A_act = 1, 
                bra_00A_lib = 'HCQ+LPV/r', 
                bra_00B_act = 1, 
                bra_00B_lib = 'HCQ+DRV/r', 
                bra_00C_act = 1, 
                bra_00C_lib = 'LPV/r+TMS', 
                bra_00D_act = None, 
                bra_00D_lib = None, 
                bra_00E_act = None, 
                bra_00E_lib = None, 
                bra_00F_act = None, 
                bra_00F_lib = None, 
                bra_00G_act = None, 
                bra_00G_lib = None, 
                bra_00H_act = None, 
                bra_00H_lib = None, 
                bra_00I_act = None, 
                bra_00I_lib = None, 
                bra_00J_act = None, 
                bra_00J_lib = None, 
                bra_dat = timezone.now(), 
                bra_log = 'admin', 
                pay_ide_id = 2
            )

【问题讨论】:

    标签: django postgresql unique-constraint


    【解决方案1】:

    实际上,您正在使用 1 重新启动序列,然后在您的查询中手动传递 bra_ide 的值。因此,当您执行这些查询时,该序列不会用于创建默认列。当您尝试插入时,该序列提供的值为 1,因为它是第一次运行,您会收到一个完整性错误。

    在运行查询时,会删除 bra_ide 列及其值。所以你的序列会自动生成值。

    【讨论】:

    • 很高兴为您提供帮助。将其标记为帮助他人的答案。
    猜你喜欢
    • 2019-09-22
    • 2011-05-25
    • 2016-06-12
    • 2016-11-27
    • 2018-03-14
    • 2012-12-31
    • 2016-09-28
    • 2021-11-03
    相关资源
    最近更新 更多