diff options
| author | Jordan Bae <qoentlr37@naver.com> | 2021-09-25 12:59:36 +0900 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-09-28 06:20:37 +0200 |
| commit | f5a3243911a5c42775cd838a3da1d0f3ac4a74ee (patch) | |
| tree | ec0aea23d6f8fc96032fb2ba22e5fba58ec509e6 | |
| parent | 4ffada36097ceccfd6f0d358217ac3c40d2a729c (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.py | 6 | ||||
| -rw-r--r-- | django/db/backends/oracle/schema.py | 6 | ||||
| -rw-r--r-- | 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): |
