From ec13e801b820614ff374cb0046092caab8d67249 Mon Sep 17 00:00:00 2001 From: Sergey Fursov Date: Mon, 12 Sep 2022 08:52:18 +0200 Subject: [PATCH] Refs #31335 -- Added SchemaEditor._create_missing_fk_index() on MySQL. --- django/db/backends/mysql/schema.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/django/db/backends/mysql/schema.py b/django/db/backends/mysql/schema.py index d6d303f0f0edc..044a752c7a5a1 100644 --- a/django/db/backends/mysql/schema.py +++ b/django/db/backends/mysql/schema.py @@ -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):