Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 6453)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -87,8 +87,10 @@
         self.name = name
         self.verbose_name = verbose_name
         self.primary_key = primary_key
-        self.max_length, self.unique = max_length, unique
-        self.blank, self.null = blank, null
+        self.max_length = max_length
+        self.unique = unique or primary_key
+        self.blank = blank
+        self.null = null
         # Oracle treats the empty string ('') as null, so coerce the null
         # option whenever '' is a possible value.
         if self.empty_strings_allowed and settings.DATABASE_ENGINE == 'oracle':
@@ -98,7 +100,8 @@
         self.serialize = serialize
         self.validator_list = validator_list or []
         self.prepopulate_from = prepopulate_from
-        self.unique_for_date, self.unique_for_month = unique_for_date, unique_for_month
+        self.unique_for_date = unique_for_date
+        self.unique_for_month = unique_for_month
         self.unique_for_year = unique_for_year
         self._choices = choices or []
         self.radio_admin = radio_admin
Index: django/db/backends/mysql_old/base.py
===================================================================
--- django/db/backends/mysql_old/base.py	(revision 6453)
+++ django/db/backends/mysql_old/base.py	(working copy)
@@ -64,7 +64,7 @@
             return getattr(self.cursor, attr)
 
 class DatabaseFeatures(BaseDatabaseFeatures):
-    autoindexes_primary_keys = False
+    pass 
 
 class DatabaseOperations(BaseDatabaseOperations):
     def date_extract_sql(self, lookup_type, field_name):
Index: django/db/backends/mysql/base.py
===================================================================
--- django/db/backends/mysql/base.py	(revision 6453)
+++ django/db/backends/mysql/base.py	(working copy)
@@ -60,7 +60,7 @@
 # TRADITIONAL will automatically cause most warnings to be treated as errors.
 
 class DatabaseFeatures(BaseDatabaseFeatures):
-    autoindexes_primary_keys = False
+	pass
 
 class DatabaseOperations(BaseDatabaseOperations):
     def date_extract_sql(self, lookup_type, field_name):
Index: django/db/backends/oracle/base.py
===================================================================
--- django/db/backends/oracle/base.py	(revision 6453)
+++ django/db/backends/oracle/base.py	(working copy)
@@ -23,7 +23,6 @@
 
 class DatabaseFeatures(BaseDatabaseFeatures):
     allows_group_by_ordinal = False
-    allows_unique_and_pk = False        # Suppress UNIQUE/PK for Oracle (ORA-02259)
     needs_datetime_string_cast = False
     needs_upper_for_iops = True
     supports_tablespaces = True
Index: django/db/backends/__init__.py
===================================================================
--- django/db/backends/__init__.py	(revision 6453)
+++ django/db/backends/__init__.py	(working copy)
@@ -41,8 +41,6 @@
 
 class BaseDatabaseFeatures(object):
     allows_group_by_ordinal = True
-    allows_unique_and_pk = True
-    autoindexes_primary_keys = True
     needs_datetime_string_cast = True
     needs_upper_for_iops = False
     supports_constraints = True
Index: django/core/management/commands/createcachetable.py
===================================================================
--- django/core/management/commands/createcachetable.py	(revision 6453)
+++ django/core/management/commands/createcachetable.py	(working copy)
@@ -21,10 +21,10 @@
         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);" % \
Index: django/core/management/sql.py
===================================================================
--- django/core/management/sql.py	(revision 6453)
+++ django/core/management/sql.py	(working copy)
@@ -263,11 +263,11 @@
         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))
@@ -281,7 +281,7 @@
             else:
                 # We haven't yet created the table to which this field
                 # is related, so save it for later.
-                pr = pending_references.setdefault(f.rel.to, []).append((model, f))
+                r = pending_references.setdefault(f.rel.to, []).append((model, f))
         table_output.append(' '.join(field_output))
     if opts.order_with_respect_to:
         table_output.append(style.SQL_FIELD(qn('_order')) + ' ' + \
@@ -348,7 +348,7 @@
     for f in opts.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 = ''
@@ -427,7 +427,7 @@
 
     qn = connection.ops.quote_name
     for f in model._meta.fields:
-        if f.db_index and not ((f.primary_key or f.unique) and connection.features.autoindexes_primary_keys):
+        if f.db_index and not f.unique:
             unique = f.unique and 'UNIQUE ' or ''
             tablespace = f.db_tablespace or model._meta.db_tablespace
             if tablespace and connection.features.supports_tablespaces:
