Opened 3 months ago

Last modified 2 days ago

#37069 closed Cleanup/optimization

Document that UniqueConstraint may create unique indexes unassociated with actual database constraints — at Version 3

Reported by: Clifford Gama Owned by: Clifford Gama
Component: Documentation Version: dev
Severity: Normal Keywords: unique
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 (last modified by Clifford Gama)

The docs for UniqueConstraint:

Creates a unique constraint in the database.

This is not always true. Depending on the options used, UniqueConstraint may instead create a unique index via CREATE UNIQUE INDEX rather than a database constraint via ALTER TABLE ... ADD CONSTRAINT ... UNIQUE (source).

For example, adding the following constraints to a model with a name field:

constraints = [
    models.UniqueConstraint(models.F("name"), name="unique_name_exp"),
    models.UniqueConstraint(fields=["name"], name="unique_name_field"),
]

produces the following SQL on PostgreSQL:

BEGIN;
-- Create constraint unique_name_exp on model mymodel
CREATE UNIQUE INDEX "unique_name_exp" ON "myapp_mymodel" ("name");
-- Create constraint unique_name_field on model mymodel
ALTER TABLE "myapp_mymodel" ADD CONSTRAINT "unique_name_field" UNIQUE ("name");
COMMIT;

See also Allow unique indexes (via UniqueConstraint) to be created/dropped CONCURRENTLY on PostgreSQL where this came up as something of an issue.

Change History (3)

comment:1 by Jacob Walls, 3 months ago

Triage Stage: UnreviewedAccepted

I agree we can improve this a bit. Maybe "create a uniqueness rule"?

in reply to:  1 comment:2 by Clifford Gama, 3 weeks ago

Replying to Jacob Walls:

Thanks Jacob for the triage. I think we should opt for something more specific rather than leave folks guessing. What do you think of "Creates a unique constraint or a unique index in the database, depending on the options used" and maybe calling out which options create what in an admonition?

comment:3 by Clifford Gama, 6 days ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top