From f5a3243911a5c42775cd838a3da1d0f3ac4a74ee Mon Sep 17 00:00:00 2001 From: Jordan Bae Date: Sat, 25 Sep 2021 12:59:36 +0900 Subject: [PATCH] Fixed #33125 -- Avoided redundant unique constraint when converting a non-unique field to primary key on MySQL and PostgreSQL. --- django/db/backends/base/schema.py | 6 ++++-- django/db/backends/oracle/schema.py | 6 ------ tests/schema/tests.py | 7 +++++++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 896ea3d517..412fb46f16 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -1155,8 +1155,10 @@ class BaseDatabaseSchemaEditor: return not old_field.primary_key and new_field.primary_key def _unique_should_be_added(self, old_field, new_field): - return (not old_field.unique and new_field.unique) or ( - old_field.primary_key and not new_field.primary_key and new_field.unique + return ( + not new_field.primary_key and + new_field.unique and + (not old_field.unique or old_field.primary_key) ) def _rename_field_sql(self, table, old_field, new_field, new_type): diff --git a/django/db/backends/oracle/schema.py b/django/db/backends/oracle/schema.py index 0d1c7f5d4b..47d60ea290 100644 --- a/django/db/backends/oracle/schema.py +++ b/django/db/backends/oracle/schema.py @@ -174,12 +174,6 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): return False return create_index - def _unique_should_be_added(self, old_field, new_field): - return ( - super()._unique_should_be_added(old_field, new_field) and - not self._field_became_primary_key(old_field, new_field) - ) - def _is_identity_column(self, table_name, column_name): with self.connection.cursor() as cursor: cursor.execute(""" diff --git a/tests/schema/tests.py b/tests/schema/tests.py index 9e23c4608e..b8ad08239b 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -741,6 +741,13 @@ class SchemaTests(TransactionTestCase): with connection.schema_editor() as editor: editor.remove_field(Author, Author._meta.get_field('id')) editor.alter_field(Author, old_field, new_field, strict=True) + # Redundant unique constraint is not added. + count = self.get_constraints_count( + Author._meta.db_table, + Author._meta.get_field('uuid').column, + None, + ) + self.assertLessEqual(count['uniques'], 1) @isolate_apps('schema') def test_alter_primary_key_quoted_db_table(self):