For better understanding first look what server is doing. DROP SCHEMA IF EXISTS indextest; CREATE SCHEMA indextest CHARSET UTF8; USE indextest; CREATE TABLE t(i INTEGER, j INTEGER, PRIMARY KEY(i))ENGINE=INNODB; -- Test without specials: CREATE TABLE w(i INTEGER, j INTEGER, fkt INTEGER, PRIMARY KEY(i))ENGINE=INNODB; ALTER TABLE w ADD FOREIGN KEY www (fkt) REFERENCES t(i); SHOW CREATE TABLE w; /* You will see that InnoDB created an index named www and a constraint named w_ibfk_1. Innodb only take the given name for the index not for the constraint. */ -- What happens when index already exist? CREATE TABLE x(i INTEGER, j INTEGER, fkt INTEGER, PRIMARY KEY(i))ENGINE=INNODB; CREATE UNIQUE INDEX existing_x_index ON x(fkt); ALTER TABLE x ADD FOREIGN KEY other_indexname_for_x (fkt) REFERENCES t(i); SHOW CREATE TABLE x; /* You will see: UNIQUE KEY `existing_x_index` (`fkt`), CONSTRAINT `x_ibfk_1` FOREIGN KEY (`fkt`) REFERENCES `t` (`i`) This means the name 'other_indexname_for_x' totally got ignored. */ -- What happens when existing index isn't unique? CREATE TABLE y(i INTEGER, j INTEGER, fkt INTEGER, PRIMARY KEY(i))ENGINE=INNODB; CREATE INDEX existing_y_index ON y(fkt); ALTER TABLE y ADD FOREIGN KEY other_indexname_for_y (fkt) REFERENCES t(i); SHOW CREATE TABLE y; /* Result is same as on existing unique index */ -- existing combined indexes -- Foreign key on first column in index list CREATE TABLE z(i INTEGER, j INTEGER, fkt INTEGER, fkw INTEGER, PRIMARY KEY(i))ENGINE=INNODB; CREATE UNIQUE INDEX existing_ind_z_fkt_fkw ON z(fkt, fkw); ALTER TABLE z ADD FOREIGN KEY fk_first_column_in_index (fkt) REFERENCES t(i); SHOW CREATE TABLE z; /* You will see that no new index was created */ -- Foreign key in second column in index list ALTER TABLE z ADD FOREIGN KEY fk_scnd_column_in_index (fkw) REFERENCES w(i); SHOW CREATE TABLE z; /* You will see that InnoDB created an index for column fkw */