﻿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
37069	Document that UniqueConstraint may create unique indexes unassociated with actual database constraints	Clifford Gama	Clifford Gama	"The [https://docs.djangoproject.com/en/dev/ref/models/constraints/#uniqueconstraint 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` ([https://github.com/django/django/blob/e84dc8715e91d51364ba6bda2b2fb07e7a8b750e/django/db/backends/base/schema.py#L1913-L1916 source]).

For example, adding the following constraints to a model with a `name` field:
{{{#!python
constraints = [
    models.UniqueConstraint(models.F(""name""), name=""unique_name_exp""),
    models.UniqueConstraint(fields=[""name""], name=""unique_name_field""),
]
}}}
produces the following SQL on PostgreSQL:
{{{#!sql
BEGIN;
-- Create constraint unique_name_exp on model mymodel
CREATE UNIQUE INDEX ""unique_name_exp"" ON ""upref_mymodel"" (""name"");
-- Create constraint unique_name_field on model mymodel
ALTER TABLE ""myapp_mymodel"" ADD CONSTRAINT ""unique_name_field"" UNIQUE (""name"");
COMMIT;
}}}

See also [https://github.com/django/new-features/issues/124 Allow unique indexes (via UniqueConstraint) to be created/dropped CONCURRENTLY on PostgreSQL] where this came up as something of an issue.
"	Cleanup/optimization	assigned	Documentation	dev	Normal		unique		Unreviewed	0	0	0	0	0	0
