En bref, vous souhaitez utiliser transactions (plus de doc à ce sujet) afin que vos insertions soient atomiques . C'est le seul moyen de garantir que toutes (ou aucune) vos données seront insérées. Sinon, vous pouvez vous retrouver dans la situation que vous décrivez où la base de données devient indisponible après certaines insertions et d'autres ne peuvent pas se terminer. Une transaction indique à la base de données que ce que vous faites est tout ou rien et qu'elle doit donc être annulée en cas de problème.
Lorsque vous utilisez des clés primaires synthétiques, comme vous l'êtes, PHP et d'autres langages fournissent des mécanismes pour obtenir le dernier identifiant inséré. Si vous voulez le faire entièrement dans MySQL, vous pouvez utiliser le LAST_INSERT_ID() une fonction. Vous vous retrouverez avec un code comme celui-ci :
START TRANSACTION;
INSERT INTO foo (auto,text)
VALUES(NULL,'text'); # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
VALUES(LAST_INSERT_ID(),'text'); # use ID in second table
COMMIT;