Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Make sure we only create the minimum number of table indexes for MySQL.

This patch simplifies a bunch of code for all backends and removes some
duplicate index creation for MySQL, in particular (versions 4.x and later).
Patch from Nis Jørgensen.

Fixed #5671, #5680, #7170, #7186.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7790 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit f9df4d1435fd3382fdcc06f75c1c8d62bfe78ec6 1 parent b0bc8b9
Malcolm Tredinnick malcolmt authored
1  AUTHORS
View
@@ -192,6 +192,7 @@ answer newbie questions, and generally made Django that much better:
james_027@yahoo.com
jcrasta@gmail.com
Zak Johnson <zakj@nox.cx>
+ Nis Jørgensen <nis@superlativ.dk>
Michael Josephson <http://www.sdjournal.com/>
jpellerin@gmail.com
junzhang.jn@gmail.com
4 django/core/management/commands/createcachetable.py
View
@@ -21,10 +21,10 @@ def handle_label(self, tablename, **options):
for f in fields:
field_output = [qn(f.name), f.db_type()]
field_output.append("%sNULL" % (not f.null and "NOT " or ""))
- if f.unique:
- field_output.append("UNIQUE")
if f.primary_key:
field_output.append("PRIMARY KEY")
+ elif f.unique:
+ field_output.append("UNIQUE")
if f.db_index:
unique = f.unique and "UNIQUE " or ""
index_output.append("CREATE %sINDEX %s_%s ON %s (%s);" % \
13 django/core/management/sql.py
View
@@ -268,11 +268,11 @@ def sql_model_create(model, style, known_models=set()):
field_output = [style.SQL_FIELD(qn(f.column)),
style.SQL_COLTYPE(col_type)]
field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or '')))
- if f.unique and (not f.primary_key or connection.features.allows_unique_and_pk):
- field_output.append(style.SQL_KEYWORD('UNIQUE'))
if f.primary_key:
field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
- if tablespace and connection.features.supports_tablespaces and (f.unique or f.primary_key) and connection.features.autoindexes_primary_keys:
+ elif f.unique:
+ field_output.append(style.SQL_KEYWORD('UNIQUE'))
+ if tablespace and connection.features.supports_tablespaces and f.unique:
# We must specify the index tablespace inline, because we
# won't be generating a CREATE INDEX statement for this field.
field_output.append(connection.ops.tablespace_sql(tablespace, inline=True))
@@ -355,7 +355,7 @@ def many_to_many_sql_for_model(model, style):
for f in opts.local_many_to_many:
if not isinstance(f.rel, generic.GenericRel):
tablespace = f.db_tablespace or opts.db_tablespace
- if tablespace and connection.features.supports_tablespaces and connection.features.autoindexes_primary_keys:
+ if tablespace and connection.features.supports_tablespaces:
tablespace_sql = ' ' + connection.ops.tablespace_sql(tablespace, inline=True)
else:
tablespace_sql = ''
@@ -460,15 +460,14 @@ def sql_indexes_for_model(model, style):
qn = connection.ops.quote_name
for f in model._meta.local_fields:
- if f.db_index and not ((f.primary_key or f.unique) and connection.features.autoindexes_primary_keys):
- unique = f.unique and 'UNIQUE ' or ''
+ if f.db_index and not f.unique:
tablespace = f.db_tablespace or model._meta.db_tablespace
if tablespace and connection.features.supports_tablespaces:
tablespace_sql = ' ' + connection.ops.tablespace_sql(tablespace)
else:
tablespace_sql = ''
output.append(
- style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
+ style.SQL_KEYWORD('CREATE INDEX') + ' ' + \
style.SQL_TABLE(qn('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \
style.SQL_KEYWORD('ON') + ' ' + \
style.SQL_TABLE(qn(model._meta.db_table)) + ' ' + \
2  django/db/backends/__init__.py
View
@@ -41,8 +41,6 @@ def make_debug_cursor(self, cursor):
class BaseDatabaseFeatures(object):
allows_group_by_ordinal = True
- allows_unique_and_pk = True
- autoindexes_primary_keys = True
inline_fk_references = True
needs_datetime_string_cast = True
supports_constraints = True
1  django/db/backends/mysql/base.py
View
@@ -60,7 +60,6 @@
# TRADITIONAL will automatically cause most warnings to be treated as errors.
class DatabaseFeatures(BaseDatabaseFeatures):
- autoindexes_primary_keys = False
inline_fk_references = False
empty_fetchmany_value = ()
update_can_self_select = False
1  django/db/backends/mysql_old/base.py
View
@@ -64,7 +64,6 @@ def __getattr__(self, attr):
return getattr(self.cursor, attr)
class DatabaseFeatures(BaseDatabaseFeatures):
- autoindexes_primary_keys = False
inline_fk_references = False
empty_fetchmany_value = ()
update_can_self_select = False
1  django/db/backends/oracle/base.py
View
@@ -24,7 +24,6 @@
class DatabaseFeatures(BaseDatabaseFeatures):
allows_group_by_ordinal = False
- allows_unique_and_pk = False # Suppress UNIQUE/PK for Oracle (ORA-02259)
empty_fetchmany_value = ()
needs_datetime_string_cast = False
supports_tablespaces = True
6 django/db/models/fields/__init__.py
View
@@ -91,7 +91,7 @@ def __init__(self, verbose_name=None, name=None, primary_key=False,
self.name = name
self.verbose_name = verbose_name
self.primary_key = primary_key
- self.max_length, self.unique = max_length, unique
+ self.max_length, self._unique = max_length, unique
self.blank, self.null = blank, null
# Oracle treats the empty string ('') as null, so coerce the null
# option whenever '' is a possible value.
@@ -168,6 +168,10 @@ def db_type(self):
except KeyError:
return None
+ def unique(self):
+ return self._unique or self.primary_key
+ unique = property(unique)
+
def validate_full(self, field_data, all_data):
"""
Returns a list of errors for this field. This is the main interface,
Please sign in to comment.
Something went wrong with that request. Please try again.