Refs #31335 -- Added SchemaEditor._create_missing_fk_index() on MySQL.

This commit is contained in:
Sergey Fursov 2022-09-12 08:52:18 +02:00 committed by Mariusz Felisiak
parent f3cd252cfc
commit ec13e801b8
1 changed files with 17 additions and 6 deletions

View File

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