From 82ce55dbbe2d96e8b5d1fcb4a1d52b73e08e7929 Mon Sep 17 00:00:00 2001 From: Ed Morley Date: Thu, 1 Dec 2016 15:54:58 +0000 Subject: [PATCH] [1.10.x] Fixed #27558 -- Prevented redundant index on InnoDB ForeignKey. The MySQL backend overrides _field_should_be_indexed() so that it skips index creation for ForeignKeys when using InnoDB. --- django/db/backends/base/schema.py | 2 +- docs/releases/1.10.4.txt | 3 +++ tests/indexes/tests.py | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index e06b29f3db9..0d35f7be68c 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -418,7 +418,7 @@ class BaseDatabaseSchemaEditor(object): } self.execute(sql) # Add an index, if required - if field.db_index and not field.unique: + if self._field_should_be_indexed(model, field): self.deferred_sql.append(self._create_index_sql(model, [field])) # Add any FK constraints later if field.remote_field and self.connection.features.supports_foreign_keys and field.db_constraint: diff --git a/docs/releases/1.10.4.txt b/docs/releases/1.10.4.txt index 86ce644fdf0..5ac17ec38ae 100644 --- a/docs/releases/1.10.4.txt +++ b/docs/releases/1.10.4.txt @@ -26,3 +26,6 @@ Bugfixes * Prevented ``LocaleMiddleware`` from redirecting on URLs that should return 404 when using ``prefix_default_language=False`` (:ticket:`27402`). + +* Prevented an unnecessary index from being created on an InnoDB ``ForeignKey`` + when the field was added after the model was created (:ticket:`27558`). diff --git a/tests/indexes/tests.py b/tests/indexes/tests.py index dfc503e15d1..8db3adc66e5 100644 --- a/tests/indexes/tests.py +++ b/tests/indexes/tests.py @@ -1,6 +1,8 @@ from unittest import skipUnless from django.db import connection +from django.db.models.deletion import CASCADE +from django.db.models.fields.related import ForeignKey from django.test import TestCase from .models import Article, ArticleTranslation, IndexTogetherSingleList @@ -74,3 +76,15 @@ class SchemaIndexesTests(TestCase): 'CREATE INDEX `indexes_articletranslation_99fb53c2` ' 'ON `indexes_articletranslation` (`article_no_constraint_id`)' ]) + + # The index also shouldn't be created if the ForeignKey is added after + # the model was created. + with connection.schema_editor() as editor: + new_field = ForeignKey(Article, CASCADE) + new_field.set_attributes_from_name('new_foreign_key') + editor.add_field(ArticleTranslation, new_field) + self.assertEqual(editor.deferred_sql, [ + 'ALTER TABLE `indexes_articletranslation` ' + 'ADD CONSTRAINT `indexes_articl_new_foreign_key_id_d27a9146_fk_indexes_article_id` ' + 'FOREIGN KEY (`new_foreign_key_id`) REFERENCES `indexes_article` (`id`)' + ])