﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
29097	Migrations using MySQL fail for constraints using composite indexes	geertjanvdk	Hasan Ramezani	"When running migrations which create (unique) composite indexes, the MySQL introspection fails to get the correct index:

ValueError: Found wrong number (0) of constraints for product_versions(product_id, ordering)

This was previously reported as fixed (see https://code.djangoproject.com/ticket/28697), but it is not. Using 1.11.5, and 1.11.9, it fails.

The fix is very easy: in DatabaseIntrospection.get_constraints(), an ORDER BY is missing when selecting from the table INFOMRATION_SCHEMA.KEY_COLUMN_USAGE:

 Thus:

{{{
    def get_constraints(self, cursor, table_name):
        """"""
        Retrieves any constraints or keys (unique, pk, fk, check, index) across one or more columns.
        """"""
        constraints = {}
        # Get the actual constraint names and columns
        name_query = """"""
            SELECT kc.`constraint_name`, kc.`column_name`,
                kc.`referenced_table_name`, kc.`referenced_column_name`
            FROM information_schema.key_column_usage AS kc
            WHERE
                kc.table_schema = DATABASE() AND
                kc.table_name = %s
            ORDER BY kc.`constraint_name`, kc.`ordinal_position`
        """"""
       ....
}}}

The ORDER BY assures the order the columns were specified. the SHOW INDEX statement does this by default.

The above should work for all MySQL versions supported.

Note that Django 2.0 has the same issue.

Patch available https://github.com/geertjanvdk/django/commit/ab0bcb327c51aab71f58789eb55a7981dcb06fdb"	Bug	closed	Migrations	1.11	Normal	fixed	introspection mysql migration index constraint		Accepted	1	0	0	0	0	0
