Fixed #33125 -- Avoided redundant unique constraint when converting a non-unique field to primary key on MySQL and PostgreSQL.

This commit is contained in:
Jordan Bae 2021-09-25 12:59:36 +09:00 committed by Mariusz Felisiak
parent 4ffada3609
commit f5a3243911
3 changed files with 11 additions and 8 deletions

View File

@ -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):

View File

@ -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("""

View File

@ -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):