Il modo in cui di solito lo faccio è usare una tabella temporanea. Probabilmente non è efficiente dal punto di vista computazionale ma sembra funzionare bene! Qui sto duplicando il record 99 nella sua interezza, creando il record 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;
Spero che funzioni bene per te!