Django:重复键值违反了 Postgresql 的唯一约束,而不是 SQlite -> 为什么?
Django: duplicate key value violates unique constraint with Postgresql not with SQlite -> why?
我刚刚使用 Postgresql 数据库部署了我的项目,并收到一个错误,违反了我的 sqlite 开发数据库没有的唯一约束
IntegrityError at /randomization_settings/edit/
duplicate key value violates unique constraint "adm_bra_pkey"
DETAIL: Key (bra_ide)=(1) already exists.
我有一个 table (adm_bra) 预填充了 2 行。
我尝试在视图中使用 models.objects.create() 方法使用代码插入新行。
为什么这发生在 postgresql 而不是 sqlite 数据库?
我尝试删除并重新启动 adm_bra 的序列,但它不起作用!
感谢帮助
编辑
我做了一些测试
首先我重新初始化了我的 table
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
)
实际上您正在使用 1 重新启动序列,然后在您的查询中手动传递 bra_ide 的值。因此,当您执行这些查询时,序列不用于创建默认列。当您尝试插入时,序列提供值 1,因为它是第一次 运行,您会收到完整性错误。
While 运行ning 查询删除了 bra_ide 列及其值。因此您的序列将自动生成值。
我刚刚使用 Postgresql 数据库部署了我的项目,并收到一个错误,违反了我的 sqlite 开发数据库没有的唯一约束
IntegrityError at /randomization_settings/edit/ duplicate key value violates unique constraint "adm_bra_pkey" DETAIL: Key (bra_ide)=(1) already exists.
我有一个 table (adm_bra) 预填充了 2 行。
我尝试在视图中使用 models.objects.create() 方法使用代码插入新行。
为什么这发生在 postgresql 而不是 sqlite 数据库? 我尝试删除并重新启动 adm_bra 的序列,但它不起作用!
感谢帮助
编辑 我做了一些测试 首先我重新初始化了我的 table
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
)
实际上您正在使用 1 重新启动序列,然后在您的查询中手动传递 bra_ide 的值。因此,当您执行这些查询时,序列不用于创建默认列。当您尝试插入时,序列提供值 1,因为它是第一次 运行,您会收到完整性错误。
While 运行ning 查询删除了 bra_ide 列及其值。因此您的序列将自动生成值。