Opened 4 years ago
Closed 4 years ago
#33125 closed Cleanup/optimization (fixed)
Changing model field to become PK creates redundant UNIQUE constraint
| Reported by: | Fabio Sangiovanni | Owned by: | Jordan Bae |
|---|---|---|---|
| Component: | Migrations | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Ready for checkin | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
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
Change History (7)
comment:1 by , 4 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|---|
| Type: | Bug → Cleanup/optimization |
comment:3 by , 4 years ago
| Has patch: | set |
|---|
comment:4 by , 4 years ago
| Needs tests: | set |
|---|---|
| Patch needs improvement: | set |
comment:5 by , 4 years ago
| Needs tests: | unset |
|---|---|
| Patch needs improvement: | unset |
Thank you for reviewing! I updated the code :)
comment:6 by , 4 years ago
| Triage Stage: | Accepted → Ready for checkin |
|---|
Thanks for the report. We can probably add the same behavior as in #29496 (see 6dd4edb1b4f5441c5f543e29395039839c50d10b) on Oracle to other backends.