summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Bae <qoentlr37@naver.com>2021-09-25 12:59:36 +0900
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-09-28 06:20:37 +0200
commitf5a3243911a5c42775cd838a3da1d0f3ac4a74ee (patch)
treeec0aea23d6f8fc96032fb2ba22e5fba58ec509e6
parent4ffada36097ceccfd6f0d358217ac3c40d2a729c (diff)
Fixed #33125 -- Avoided redundant unique constraint when converting a non-unique field to primary key on MySQL and PostgreSQL.
-rw-r--r--django/db/backends/base/schema.py6
-rw-r--r--django/db/backends/oracle/schema.py6
-rw-r--r--tests/schema/tests.py7
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):