Altamente probable que tengas datos inconsistentes...
Si las tablas tienen datos, lo más probable es que una o mas de una a las que quieres poner la FK contienen en ese campo datos que no están en la tabla a la que harán referencia.
La solución más fácil es borrar todos los datos de todas las tablas antes de crear la FK.
Si no puedes, sólo resta eliminar los registros que están mal.
Nota: Otra posibilidad es que haya diferenta de tipo de dato en alguna tabla. Por ejemplo, no puedes relacionar INT con SMALLINT u otra cosa, como tampoco puedes relacionar un INT UNSIGNED con un INT con signo, ni tampoco VARCHAR(100) con VARCHAR(101), por dar una idea.
Los tipos de dato entre PK y FK deben ser
exactamente los mismos.
En tu caso, a pesar de que en ambas tablas "usuario_id" es un INT, le estás poniendo esa basura de "(4)", que es totalmente innecesaria, pero puede traer problemas.
Los tipo de dato entero deben dejarse con su valor pro default, sin poner ese numerito que no restringe nada, sino que se usa para otra cosa.
Declaralo como UNSIGNED directamente y sin agregados:
Código MySQL:
Ver original
--
-- esta es la relacion de las tablas
--
Otro detalle, producto más de lógica de sistemas que de SQL: Un nombre_usuario no puede tener un valor por default vacío, así como tampoco debe repetirse. Ese campo debe ser UNIQUE. Tampoco puede tener valor por defecto una
clave. SI lo hicieras estarías permitiendo la entrada a cualquiera, tanto en uno como en otro caso.
¿Se entiende?