duplicate key value violates unique constraint in django

Question:

I have function for creating new user in django as follows:

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

Then I do it as follows:

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()

But when I try to create new user I get error as follows:

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

The id 21811 exists in the database but the last one is 25530.

Why django does not use the first next number for ID?

UPDATE

  • User model is standard model from django.
  • UserProfile is as follows:

    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)
    
Asked By: Boky

||

Answers:

This is not an issue with Django

duplicate key violates a unique constraint

This message occurs when you create a duplicate key. In your case, this likely means that the primary key sequence in the table you’re working with has become out of sync. This could be because of a manual import, that is often the case with for me when I have had this issue. You have to manually reset the primary key index.

I am not sure what your database is, I will share with you the rough Postgres SQL commands I would use to fix it, the first two allow you to see if it is out of sync and the last one will fix it if so. If this isnt enough/its a different db please comment

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);
Answered By: Lucas Hendren

I’ve solved the problem by executing following code:

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;
Answered By: Boky

For me the issue was to reset the id in the log.

So you run this
SELECT id FROM 'the_table_name' order by id desc limit 1;
The number that is returned you increment by 1. Lets say it’s 14, then you set it to 15.
SELECT setval('public.the_table_name_id_seq', 15);

Answered By: Em.C
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.