En resumen, desea utilizar transacciones (más documento sobre esto) para que sus inserciones sean atomic . Esta es la única forma de garantizar que se insertarán todos (o ninguno) de sus datos. De lo contrario, puede entrar en la situación que describe en la que la base de datos deja de estar disponible después de algunas inserciones y otras no pueden completarse. Una transacción le dice a la base de datos que lo que está haciendo es todo o nada, por lo que debe retroceder si algo sale mal.
Cuando está utilizando claves primarias sintéticas, PHP y otros lenguajes proporcionan mecanismos para obtener la última identificación insertada. Si desea hacerlo completamente en MySQL, puede usar LAST_INSERT_ID() función. Terminará con un código como este:
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;