Index: django/db/backends/__init__.py
===================================================================
--- django/db/backends/__init__.py	(revision 8349)
+++ django/db/backends/__init__.py	(working copy)
@@ -71,6 +71,7 @@
     interprets_empty_strings_as_nulls = False
     can_use_chunked_reads = True
     uses_savepoints = False
+    keys_need_similar_types = False
 
 class BaseDatabaseOperations(object):
     """
Index: django/db/backends/mysql/base.py
===================================================================
--- django/db/backends/mysql/base.py	(revision 8349)
+++ django/db/backends/mysql/base.py	(working copy)
@@ -80,6 +80,7 @@
 class DatabaseFeatures(BaseDatabaseFeatures):
     empty_fetchmany_value = ()
     update_can_self_select = False
+    keys_need_similar_types = True
 
 class DatabaseOperations(BaseDatabaseOperations):
     def date_extract_sql(self, lookup_type, field_name):
Index: django/db/backends/mysql/creation.py
===================================================================
--- django/db/backends/mysql/creation.py	(revision 8349)
+++ django/db/backends/mysql/creation.py	(working copy)
@@ -19,8 +19,8 @@
         'FloatField':        'double precision',
         'IntegerField':      'integer',
         'IPAddressField':    'char(15)',
+        'KeyField':          'integer',
         'NullBooleanField':  'bool',
-        'OneToOneField':     'integer',
         'PhoneNumberField':  'varchar(20)',
         'PositiveIntegerField': 'integer UNSIGNED',
         'PositiveSmallIntegerField': 'smallint UNSIGNED',
Index: django/db/backends/oracle/creation.py
===================================================================
--- django/db/backends/oracle/creation.py	(revision 8349)
+++ django/db/backends/oracle/creation.py	(working copy)
@@ -28,8 +28,8 @@
         'FloatField':                   'DOUBLE PRECISION',
         'IntegerField':                 'NUMBER(11)',
         'IPAddressField':               'VARCHAR2(15)',
+        'KeyField':                     'NUMBER(11)',
         'NullBooleanField':             'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(qn_column)s IS NULL))',
-        'OneToOneField':                'NUMBER(11)',
         'PhoneNumberField':             'VARCHAR2(20)',
         'PositiveIntegerField':         'NUMBER(11) CHECK (%(qn_column)s >= 0)',
         'PositiveSmallIntegerField':    'NUMBER(11) CHECK (%(qn_column)s >= 0)',
Index: django/db/backends/postgresql/creation.py
===================================================================
--- django/db/backends/postgresql/creation.py	(revision 8349)
+++ django/db/backends/postgresql/creation.py	(working copy)
@@ -19,8 +19,8 @@
         'FloatField':        'double precision',
         'IntegerField':      'integer',
         'IPAddressField':    'inet',
+        'KeyField':          'integer',
         'NullBooleanField':  'boolean',
-        'OneToOneField':     'integer',
         'PhoneNumberField':  'varchar(20)',
         'PositiveIntegerField': 'integer CHECK ("%(column)s" >= 0)',
         'PositiveSmallIntegerField': 'smallint CHECK ("%(column)s" >= 0)',
Index: django/db/backends/sqlite3/creation.py
===================================================================
--- django/db/backends/sqlite3/creation.py	(revision 8349)
+++ django/db/backends/sqlite3/creation.py	(working copy)
@@ -20,8 +20,8 @@
         'FloatField':                   'real',
         'IntegerField':                 'integer',
         'IPAddressField':               'char(15)',
+        'KeyField':                     'integer',
         'NullBooleanField':             'bool',
-        'OneToOneField':                'integer',
         'PhoneNumberField':             'varchar(20)',
         'PositiveIntegerField':         'integer unsigned',
         'PositiveSmallIntegerField':    'smallint unsigned',
Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 8349)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -808,6 +808,9 @@
         defaults.update(kwargs)
         return super(IPAddressField, self).formfield(**defaults)
 
+class KeyField(IntegerField):
+    pass
+
 class NullBooleanField(Field):
     empty_strings_allowed = False
     def __init__(self, *args, **kwargs):
Index: django/db/models/fields/related.py
===================================================================
--- django/db/models/fields/related.py	(revision 8349)
+++ django/db/models/fields/related.py	(working copy)
@@ -1,6 +1,6 @@
 from django.db import connection, transaction
 from django.db.models import signals, get_model
-from django.db.models.fields import AutoField, Field, IntegerField, PositiveIntegerField, PositiveSmallIntegerField, FieldDoesNotExist
+from django.db.models.fields import AutoField, Field, KeyField, PositiveIntegerField, PositiveSmallIntegerField, FieldDoesNotExist
 from django.db.models.related import RelatedObject
 from django.db.models.query import QuerySet
 from django.db.models.query_utils import QueryWrapper
@@ -713,8 +713,12 @@
         # points to an AutoField/PositiveIntegerField/PositiveSmallIntegerField,
         # in which case the column type is simply that of an IntegerField.
         rel_field = self.rel.get_related_field()
-        if isinstance(rel_field, (AutoField, PositiveIntegerField, PositiveSmallIntegerField)):
-            return IntegerField().db_type()
+        if isinstance(rel_field, AutoField) \
+            or (not connection.features.keys_need_similar_types and 
+                isinstance(rel_field, (AutoField, 
+                                       PositiveIntegerField, 
+                                       PositiveSmallIntegerField))):
+            return KeyField().db_type()
         return rel_field.db_type()
 
 class OneToOneField(ForeignKey):
