summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Morley <emorley@mozilla.com>2016-12-01 15:54:58 +0000
committerTim Graham <timograham@gmail.com>2016-12-01 12:25:37 -0500
commit82ce55dbbe2d96e8b5d1fcb4a1d52b73e08e7929 (patch)
treef747b6913889684a029a06b68c4df443f2425e8e
parent4074fa91452006890a878f0b6a1a25251461cf26 (diff)
downloaddjango-82ce55dbbe2d96e8b5d1fcb4a1d52b73e08e7929.tar.gz
[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.
-rw-r--r--django/db/backends/base/schema.py2
-rw-r--r--docs/releases/1.10.4.txt3
-rw-r--r--tests/indexes/tests.py14
3 files changed, 18 insertions, 1 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index e06b29f3db..0d35f7be68 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 86ce644fdf..5ac17ec38a 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 dfc503e15d..8db3adc66e 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`)'
+ ])