【问题标题】:duplicate key value violates unique constraint in django重复的键值违反了 Django 中的唯一约束
【发布时间】:2019-05-24 05:43:22
【问题描述】:

我有在 django 中创建新用户的功能如下:

def initialize(username, password, email, title, firstName, lastName,  telephoneNumber, mobileNumber, smsActive, for_company_id = 1):
    sUsername = username.lower()
    if len(username) > 30:
        sUsername = username[:30].lower()
    user = User.objects.create_user(sUsername, email, password, last_login=datetime.datetime.now())
    user.first_name = firstName
    user.last_name = lastName
    user.save()
    userProfile = UserProfile(user = user, title = title, telephone = telephoneNumber, mobile = mobileNumber, smsActive = smsActive)
    userProfile.code2Factor = pyotp.random_base32()
    userProfile.forCompanyId = for_company_id
    userProfile.main_updated = datetime.datetime.now()
    userProfile.save()
    return userProfile

然后我按如下方式进行:

user_profile = initialize(input.user.username, password, '', input.title, input.user.first_name, input.user.last_name, input.telephone, input.mobile, sms_active)
user_profile.user.groups.set([Group.objects.get(id=gr.id) for gr in input.groups])
user_profile.cultureMajor = input.cultureMajor
user_profile.offerTax = input.offerTax if 'offerTax' in input else False
user_profile.user.save()

但是当我尝试创建新用户时,出现如下错误:

duplicate key value violates unique constraint "auth_user_pkey" DETAIL: Key (id)=(21811) already exists.

id 21811 存在于数据库中,但最后一个是25530

为什么 django 不使用下一个数字作为 ID?

更新

  • 用户模型是来自 django 的标准模型。
  • UserProfile如下:

    class UserProfile(models.Model):
        forCompanyId = 1
        user = models.OneToOneField(to=User, on_delete=models.DO_NOTHING)
        title = models.CharField(max_length=10, null=True, blank=True)
        telephone = models.CharField(max_length=50, null=True, blank=True)
        mobile = models.CharField(max_length=50, null=True, blank=True)
        smsActive = models.BooleanField(default=False)
        car_by_car_notification = models.BooleanField(default=True)
        car_by_car_mail = models.BooleanField(default=True)
        daily_digest = models.BooleanField(default=True)
        offer_tax = models.BooleanField(default=False)
        cultureMajor = models.CharField(max_length=3, blank=False, default='en')
        cultureMinor = models.CharField(max_length=3, blank=True)
        modulesBlocked = models.ManyToManyField(to=Module, through='UserModuleBlocked')
        otherEmails = models.CharField(max_length=512, null=True, blank=True)
        otherContact = models.CharField(max_length=256, null=True, blank=True)
        browser = models.CharField(max_length=256, null=True, blank=True)
        picture = models.ImageField(upload_to=settings.MEDIA_ROOT, blank=True, null=True)
        code2Factor = models.CharField(max_length=256, null=True, blank=True)
        mobile2Factor = models.BooleanField(default=False)
        authenticator2Factor = models.BooleanField(default=False)
        main_user_id = models.IntegerField(null=True)
        main_updated = models.DateTimeField(_('date updated on main'), default=timezone.now)
    

【问题讨论】:

  • 你能显示用户和userprofile模型吗
  • 您使用的是哪个数据库?
  • @c.grey 已更新。
  • @JPG PostgreSQL
  • 尝试从 django-shell 创建一个虚拟用户为 User.objects.create(id=25531,username="fooo") @Boky

标签: python django


【解决方案1】:

我已经通过执行以下代码解决了这个问题:

BEGIN;
SELECT setval(pg_get_serial_sequence('"auth_permission"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_permission";
SELECT setval(pg_get_serial_sequence('"auth_group_permissions"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_group_permissions";
SELECT setval(pg_get_serial_sequence('"auth_group"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_group";
SELECT setval(pg_get_serial_sequence('"auth_user_groups"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_user_groups";
SELECT setval(pg_get_serial_sequence('"auth_user_user_permissions"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_user_user_permissions";
SELECT setval(pg_get_serial_sequence('"auth_user"','id'), coalesce(max("id"), 1), max("id") IS NOT null) FROM "auth_user";
COMMIT;

【讨论】:

    【解决方案2】:

    这不是 Django 的问题

    duplicate key violates a unique constraint
    

    当您创建重复密钥时会出现此消息。在您的情况下,这可能意味着您正在使用的表中的主键序列已不同步。这可能是因为手动导入,当我遇到这个问题时,这通常是我的情况。您必须手动重置主键索引。

    我不确定你的数据库是什么,我将与你分享我用来修复它的粗略 Postgres SQL 命令,前两个允许你查看它是否不同步,最后一个将修复它如果所以。如果这还不够/它是不同的数据库,请发表评论

    SELECT MAX('auth_user_pkey') FROM User;   
    SELECT nextval('auth_user_key_sequence');
    
    SELECT setval('auth_user_key_sequence', (SELECT MAX(auth_user_pkey) FROM User)+1);
    

    【讨论】:

    • 当我执行第二个时,我得到ERROR: relation "the_primary_key_sequence" does not exist
    • 我也遇到了同样的问题。我和@Boky 有同样的错误,谁能够解决这个问题?
    • 您可以使用此查询来查找要在上面插入的“auth_user_key_sequence”:SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';
    猜你喜欢
    • 2019-09-22
    • 2021-11-03
    • 2016-06-12
    • 2016-11-27
    • 2018-03-14
    • 2012-12-31
    • 1970-01-01
    • 2011-06-26
    • 2012-06-20
    相关资源
    最近更新 更多