El motor de base de datos se encarga de hacer que funcione. Uno, como programador, es responsable de saber en qué secuencia tienen que entrar los datos, es decir, qué tabla cargar primero. En eso consiste la cosa.
De todos modos, hay un control específico que se puede hacer a nivel de aplicación y que consiste en capturar el número de error que se produce:
Cada sentencia que envías a una conexión de una base de datos devuelve por la misma conexión un número, o un mensaje. Por ejemplo, un simple "SELECT..." si funciona bien, devuelve un número que es la cantidad de registros afectados (al menos en .Net), o negativo si falló, caso en el cual puedes rescatar el mensaje o el código de error.
Si estás programando en .Net esto se maneja usando el conector .Net de MySQL, de modo de administrar vía el
Try... Catch ... As MySqlException ... End Try, la exceptción que indica un problema en la base.
De esta forma puedes saber qué pasó e indicarle al usuario qué debe hacer.
Si estás programando en PHP, será mejor que preguntes en el
foro de PHP, pero el PHP también cuenta con funciones que capturan el mensaje de error y su código.
Por experiencia propia, es mucho más sencillo si programas la aplicación para que no deje a los usuarios ingresar datos para almacenar en tablas secundarias sin que primero existan los datos necesarios en las tablas primarias... Te ahorrará muchos dolores de cabeza.