Refs #31335 -- Added SchemaEditor._create_missing_fk_index() on MySQL.
This commit is contained in:
parent
f3cd252cfc
commit
ec13e801b8
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue