Ответ AngeDeLaMort почти правильный. Конечно, наиболее подходящий способ решения этой проблемы - вставлять по одной строке за раз и опрашивать insert_id или генерировать последовательность в другом месте (что имеет дополнительные преимущества с точки зрения масштабируемости).
Я бы настоятельно рекомендовал не пытаться определить последний insert_id и сравнивать его с самым последним insert_id после вставки - просто есть и другие способы, которые не удастся.
Но ... альтернативный подход был бы:
....
"INSERT INTO destn (id, data, other, trans_ref)
SELECT id, data, other, connection_id() FROM source";
....
"SELECT id FROM destn WHERE trans_ref=connection_id()";
....
"UPDATE destn SET trans_ref=NULL where trans_ref=connection_id()";
Второй запрос вернет сгенерированные идентификаторы (обратите внимание, что это предполагает, что вы используете одно и то же соединение для всех 3 запросов). Третий запрос необходим, потому что идентификаторы соединения возвращаются в пул при разъединении (то есть используются повторно).
С