A maneira que eu costumo fazer é usando uma tabela temporária. Provavelmente não é computacionalmente eficiente, mas parece funcionar bem! Aqui estou duplicando o registro 99 em sua totalidade, criando o registro 100.
CREATE TEMPORARY TABLE tmp SELECT * FROM invoices WHERE id = 99;
UPDATE tmp SET id=100 WHERE id = 99;
INSERT INTO invoices SELECT * FROM tmp WHERE id = 100;
Espero que funcione bem para você!