Opened 9 years ago

Closed 9 years ago

Last modified 8 years ago

#1500 closed defect (fixed)

[patch] MySQL AutoField should be int, not mediumint

Reported by: ejf-django@… Owned by: adrian
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:

Description

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

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

to:

'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@… 9 years ago.
Patch for ticket #1500
mysql_autofield_patch_2.diff (1.3 KB) - added by Andy Dustman <farcepest@…> 9 years ago.
Updated patch (files moved, plus additional bugfix)

Download all attachments as: .zip

Change History (5)

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

  • Summary changed from MySQL AutoField should be int, not mediumint to [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 9 years ago by ejf-django@…

Patch for ticket #1500

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

Updated patch (files moved, plus additional bugfix)

comment:2 Changed 9 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/management.py.

comment:3 Changed 9 years ago by adrian

  • Resolution set to fixed
  • Status changed from new to closed

(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