#1500 closed defect (fixed)
[patch] MySQL AutoField should be int, not mediumint
Reported by: | 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: | no | UI/UX: | no |
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)
Change History (5)
comment:1 by , 19 years ago
Summary: | MySQL AutoField should be int, not mediumint → [patch] MySQL AutoField should be int, not mediumint |
---|
by , 19 years ago
Attachment: | mysql_autofield_patch_2.diff added |
---|
Updated patch (files moved, plus additional bugfix)
comment:2 by , 19 years ago
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 by , 19 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
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.