Refs -- Added SchemaEditor._create_missing_fk_index() on MySQL.
@@ -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):
