Opened 16 years ago
Closed 16 years ago
#7950 closed (wontfix)
Syncdb generated indices should have a consistent name
Reported by: | flytwokites | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Keywords: | ||
Cc: | Triage Stage: | Design decision needed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
This model:
class User(models.Model): live_space = models.IntegerField() name = models.CharField(max_length=30, unique=True) email = models.EmailField(max_length=50, unique=True) class Meta: unique_together = ('live_space', 'name')
In mysql, the generated indices have a mysql internal name like 'name_2', 'email_3'.
If i want to maintains indices later, i must known the index name, so i must dump db structure to determine it.
So it's better to generate a consistent name like 'ruby on rails' does.
For example the above model will generate these index names:
user__name user__email user__livespace_name
Change History (2)
comment:1 by , 16 years ago
Triage Stage: | Unreviewed → Design decision needed |
---|
comment:2 by , 16 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
Note:
See TracTickets
for help on using tickets.
I'm not aware of anything that puts _2 or _3 at the end of an index name - index names (such as the unique indexes in your example) follow the <db_table>_<column name> pattern.
Foreign key references do use a hash of the table names as part of the index name; this appears as a sequence of 10 alphanumerics at the end of an index name. However, this is done specifically because of a limitation of MySQL. These indicies need to have a unique name, but MySQL requires that the names are unique in the first 64 characters. This unique name needs to encompass 4 parts - the column name on the source and target table, and the source and target table names. Given that each of those names can easily exceed 16 characters, we can't just concatenate all the names. We've chosen to use a hash of the table names so that we only have 2 full names competing for 54 characters.