Opened 11 years ago

Closed 11 years ago

Last modified 10 years ago

#1500 closed defect (fixed)

[patch] MySQL AutoField should be int, not mediumint

Reported by: ejf-django@… Owned by: Adrian Holovaty
Component: Core (Other) Version:
Severity: normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:


I believe that the AutoField mapping in core/db/backends/ DATA_TYPES should be changed from:

'AutoField': 'mediumint(9) unsigned auto_increment'


'AutoField': 'int(10) unsigned auto_increment'

However, currently MySQL ForeignKey references go to 'int(11)', or signed integers. I'm not really clear where in the code that is happening, but ForeignKey references should be changed to unsigned ints.

There are several reasons for this:

  • We are arbitrarily limiting the table size, with the only benefit being one byte saved per row (mediumint storage is 3 bytes, int is 4)
  • INT is the canonical primary key for MySQL
  • PostgreSQL serial defaults to an INT, and is used as such in Django. Therefore MySQL Django created tables are limited compared to the equivalant Django code run against PostgreSQL. We should strive for equivalency.

Attachments (2)

mysql_autofield_patch.diff (663 bytes) - added by ejf-django@… 11 years ago.
Patch for ticket #1500
mysql_autofield_patch_2.diff (1.3 KB) - added by Andy Dustman <farcepest@…> 11 years ago.
Updated patch (files moved, plus additional bugfix)

Download all attachments as: .zip

Change History (5)

comment:1 Changed 11 years ago by ejf-django@…

Summary: MySQL AutoField should be int, not mediumint[patch] MySQL AutoField should be int, not mediumint

Ok, here is the patch to the current trunk changing AutoField for MySQL to a signed integer. Unsigned int would be better, but because of the way AutoField gets resolved to a signed integer (see #1165) and the fact that a PostgreSQL serial is signed, it cannot be without much more work. This at least removes an arbitrary table size limitation and makes MySQL generated tables functionally equivalent to PostgreSQL, sqllite, and mssql generated tables.

Changed 11 years ago by ejf-django@…

Attachment: mysql_autofield_patch.diff added

Patch for ticket #1500

Changed 11 years ago by Andy Dustman <farcepest@…>

Updated patch (files moved, plus additional bugfix)

comment:2 Changed 11 years ago by Andy Dustman <farcepest@…>

mysql_autofield_patch_2.diff is the same fix as the first, only for the magic removal branch. Plus there is a fix for breakage in rev 2528 to django/core/

comment:3 Changed 11 years ago by Adrian Holovaty

Resolution: fixed
Status: newclosed

(In [2582]) Fixed #1500 -- Changed MySQL AutoField to be integer, not mediumint. Thanks, ejf-django

Note: See TracTickets for help on using tickets.
Back to Top