Index: django/db/backends/__init__.py
===================================================================
--- django/db/backends/__init__.py	(revision 8423)
+++ 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 8423)
+++ django/db/backends/mysql/base.py	(working copy)
@@ -68,6 +68,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/models/fields/related.py
===================================================================
--- django/db/models/fields/related.py	(revision 8423)
+++ django/db/models/fields/related.py	(working copy)
@@ -729,8 +729,14 @@
         # of the field to which it points. An exception is if the ForeignKey
         # points to an AutoField/PositiveIntegerField/PositiveSmallIntegerField,
         # in which case the column type is simply that of an IntegerField.
+        # If the database needs similar types for key fields however, the only
+        # thing we can do is making AutoField an IntegerField.
         rel_field = self.rel.get_related_field()
-        if isinstance(rel_field, (AutoField, PositiveIntegerField, PositiveSmallIntegerField)):
+        if isinstance(rel_field, AutoField) \
+            or (not connection.features.keys_need_similar_types and 
+                isinstance(rel_field, (AutoField, 
+                                       PositiveIntegerField, 
+                                       PositiveSmallIntegerField))):
             return IntegerField().db_type()
         return rel_field.db_type()
 
Index: tests/regressiontests/model_regress/models.py
===================================================================
--- tests/regressiontests/model_regress/models.py	(revision 8423)
+++ tests/regressiontests/model_regress/models.py	(working copy)
@@ -32,6 +32,20 @@
 class Event(models.Model):
     when = models.DateTimeField()
 
+class Department(models.Model):
+    id = models.PositiveIntegerField(primary_key=True)
+    name = models.CharField(max_length=200)
+
+    def __unicode__(self):
+        return self.name
+    
+class Worker(models.Model):
+    department = models.ForeignKey(Department)
+    name = models.CharField(max_length=200)
+
+    def __unicode__(self):
+        return self.name
+
 __test__ = {'API_TESTS': """
 (NOTE: Part of the regression test here is merely parsing the model
 declaration. The verbose_name, in particular, did not always work.)
@@ -87,5 +101,13 @@
 datetime.datetime(2000, 1, 1, 13, 1, 1)
 >>> e.get_previous_by_when().when
 datetime.datetime(2000, 1, 1, 6, 1, 1)
+
+# Check Department and Worker
+>>> d = Department(id=10, name='IT')
+>>> d.save()
+>>> w = Worker(department=d, name='Full-time')
+>>> w.save()
+>>> w
+<Worker: Full-time>
 """
 }
