﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
33125	Changing model field to become PK creates redundant UNIQUE constraint	Fabio Sangiovanni	Jordan Bae	"Hi,

when swapping the `primary_key=True` attribute between two model fields, `migrations.AlterField` seems to generate a redundant UNIQUE constraint involving the new PK field.

To reproduce:

Prerequisites:

PostgreSQL 11.12
Python 3.8
Django main@7d909b2282c91c5bc5204dd160412e90fa86d624

Before state:


{{{
class Pony(models.Model):
    name = models.CharField(max_length=32, primary_key=True)
    nickname = models.CharField(max_length=32)
}}}


sqlmigrate:

{{{
BEGIN;
--
-- Create model Pony
--
CREATE TABLE ""app_pony"" (""name"" varchar(32) NOT NULL PRIMARY KEY, ""nickname"" varchar(32) NOT NULL);
CREATE INDEX ""app_pony_name_204da2d2_like"" ON ""app_pony"" (""name"" varchar_pattern_ops);
COMMIT;
}}}

After state:

{{{
class Pony(models.Model):
    name = models.CharField(max_length=32)
    nickname = models.CharField(max_length=32, primary_key=True)
}}}

sqlmigrate:

{{{
BEGIN;
--
-- Alter field name on pony
--
DROP INDEX IF EXISTS ""app_pony_name_204da2d2_like"";
--
-- Alter field nickname on pony
--
ALTER TABLE ""app_pony"" ADD CONSTRAINT ""app_pony_nickname_1b2a0f82_uniq"" UNIQUE (""nickname"");
ALTER TABLE ""app_pony"" ADD CONSTRAINT ""app_pony_nickname_1b2a0f82_pk"" PRIMARY KEY (""nickname"");
CREATE INDEX ""app_pony_nickname_1b2a0f82_like"" ON ""app_pony"" (""nickname"" varchar_pattern_ops);
COMMIT;
}}}

The `app_pony_nickname_1b2a0f82_uniq` constraint looks reduntant to me, since the `nickname` field is going to become PK anyways.

Please let me know if I'm missing something or if I can be of further help.

Thanks,

Fabio"	Cleanup/optimization	closed	Migrations	dev	Normal	fixed			Ready for checkin	1	0	0	0	0	0
