Skip to content

Commit

Permalink
Refs #31335 -- Added SchemaEditor._create_missing_fk_index() on MySQL.
Browse files Browse the repository at this point in the history
  • Loading branch information
GeyseR authored and felixxm committed Sep 12, 2022
1 parent f3cd252 commit ec13e80
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions django/db/backends/mysql/schema.py
Expand Up @@ -135,24 +135,35 @@ def _field_should_be_indexed(self, model, field):
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):
Expand Down

0 comments on commit ec13e80

Please sign in to comment.