А зачем эти извращения? Есть гарантированно конкурентно-безопасный LAST_INSERT_ID()
У вас insert ignore используется. Значит, данные натыкаются на уникальные индексы?
Если вы хотите "без пропусков" - вы взяли не тот инструмент.
CREATE FUNCTION insert_t1 (_link char(36)) RETURNS INT UNSIGNED
BEGIN
DECLARE _id INT UNSIGNED;
INSERT IGNORE INTO t1(link) VALUE(_link);
SELECT id FROM t1 INTO _id WHERE link = _link;
RETURN _id;
END
А, кажется понял. Вы хотите создать внешний ключ, но не создавать под него индекс?
А такое вообще возможно?