La façon dont je m'y prends habituellement est d'utiliser une table temporaire. Ce n'est probablement pas efficace en termes de calcul, mais cela semble fonctionner correctement ! Ici, je duplique l'enregistrement 99 dans son intégralité, créant l'enregistrement 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;
J'espère que cela fonctionnera bien pour vous !