diff --git a/django/db/backends/mysql/schema.py b/django/db/backends/mysql/schema.py index d6d303f0f0..044a752c7a 100644 --- a/django/db/backends/mysql/schema.py +++ b/django/db/backends/mysql/schema.py @@ -135,24 +135,35 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): return False return not self._is_limited_data_type(field) - def _delete_composed_index(self, model, fields, *args): + def _create_missing_fk_index( + self, + model, + *, + fields, + ): """ MySQL can remove an implicit FK index on a field when that field is covered by another index like a unique_together. "covered" here means - that the more complex index starts like the simpler one. - https://bugs.mysql.com/bug.php?id=37910 / Django ticket #24757 - We check here before removing the [unique|index]_together if we have to - recreate a FK index. + that the more complex index has the FK field as its first field (see + https://bugs.mysql.com/bug.php?id=37910). + + Manually create an implicit FK index to make it possible to remove the + composed index. """ first_field = model._meta.get_field(fields[0]) if first_field.get_internal_type() == "ForeignKey": constraint_names = self._constraint_names( - model, [first_field.column], index=True + model, + [first_field.column], + index=True, ) if not constraint_names: self.execute( self._create_index_sql(model, fields=[first_field], suffix="") ) + + def _delete_composed_index(self, model, fields, *args): + self._create_missing_fk_index(model, fields=fields) return super()._delete_composed_index(model, fields, *args) def _set_field_new_type_null_status(self, field, new_type):