El “errno: 150″ de MySQL

Visita este artí­culo en http://www.estadobeta.com/2008/03/16/el-errno-150-de-mysql/

Por vladimir en Desarrollo, Documentación, artículos, tips
Mestinon For Sale Septilin No Prescription Buy Abana No Prescription Buy Online Avodart Buy Himcolin Online Hytrin For Sale Levitra No Prescription Buy Proscar No Prescription Buy Online Lopid Buy Zebeta Online Azulfidine For Sale Karela No Prescription Buy Clomid No Prescription Buy Online Loxitane Buy Actoplus Met Online Capoten For Sale Celebrex No Prescription Buy Retin-A No Prescription Buy Online Prednisone Buy Levitra Online Prednisone For Sale Tricor No Prescription Buy Tramadol No Prescription Buy Online Lamisil Buy Inderal Online

No fue hasta mucho tiempo después de conocer MySQL que conocí las tablas tipo InnoDb. Estas, a diferencia de su contraparte MyISAM, poseen varias cualidades que la hacen deseable. Por ejemplo: Integridad Referencial.

Lamentablemente InnoDb posee algunos peros. Uno de los más molestos es el “errn: 150″ que aparece al ejecutar alguna sql (típicamente CREATES y ALTER) mal formada o errónea. Esto porque no ofrece información adicional para saber cómo solucionarlo. Sólo ves un escuálido “errno: 150″.

Algo poco conocido (y usado), es el status de los diferentes motores. En el caso de InnoDb, la instrucción SHOW INNODB STATUS nos ofrece un montón de información. Entre esas, nos muestra información sobre la última instrucción sql rechazada. Con esto es posible obtener mayor información del error, que te ayudará a descrubrir su origen y cómo solucionarlo.

Para el conocido proyecto phpMyAdmin, no funcionará bien si ejecutas directamente la instrucción SHOW. En vez de ello, es mejor ir al home del software y pinchar en [Motores de Almacenamiento -> InnoDb -> Estado del InnoDb].

Ahora ya no tienes excusas para no solucionar esa escurridiza instrucción SQL ;)

FUENTE: manual de referencia oficial de MySQL

ACTUALIZACIÓN: incluí esto como una sugerencia en phpmyadmin y pronto será implementada en la versión estable.  asi que al salir este error mostrará más información usando esta herramienta.

ACTUALIZACIÓN2: acaba de salir el nuevo phpMyAdmin con la sugerencia implementada

10 comentarios para “El “errno: 150″ de MySQL”

  1. GravatarClaudio S. Dice:

    Me pasó algunas veces, que dió ese error.

    Recuerdo que siempre fue por que el tipo de campo definido para la llave foranea no era igual al padre. Y cuando son muchas tablas no es fácil reconocerlo, sobre todo si las diferencias son tan sutiles como SMALLINT una y INT la otra, cuando ambas debian ser iguales.

    Saludos.

  2. GravatarJuan Dice:

    Encontré esta pagina en el segundo lugar simplemente poniendo “mysql errno 150″ en google y ya lo solucioné.
    Muchas gracias por la explicación.
    Para contar un poco nomas y que sirva como analogía de hasta donde rompe el rdbms: resulta que tenia un int(2) pero a uno le habia puesto unsigned y al otro lo habia dejado default… y kaput

    Gracias otra vez

  3. GravatarGlimachi Dice:

    Muy bueno tu consejo Gracias, me paso lo mismo, y cambie mi campo para que se identico al del campo padre y funciono los alter table para la clave foranea.

    codigo VARCHAR(10) NOT NULL

    por el del padre que era este:

    codigo varchar(10) character set utf8 collate utf8_bin NOT NULL

  4. GravatarPiero Recchia Dice:

    Excelente, resolví mi problema con este consejo. Gracias

  5. GravatarZafra Dice:

    Buena información, me fue muy útil. Gracias =)

  6. GravatarMiguelangel Cabrera Dice:

    amigo, me salvaste la vida.. era que en la clave primaria tenia not null y de tamaño 4 y en la foranea era unsigned y default null, muchas gracias..

  7. GravatarSergio Rios Dice:

    Muchas gracias por el aporte, me sirvio de mucha ayuda. gracias!!!
    xD

  8. GravatarMafe Dice:

    Gracias, casi hago fiesta cuando solucione este error y todo gracias a sus comentarios (Juan especialmente fuiste de gran ayuda)

  9. Gravatarrefusta Dice:

    A parte de los tipos, a mime daba el mismo error por que no ponia al final “DEFAULT CHARSET=utf8;”.

    Lo pongo porque yo me volvia loco de mirar que los tipos de la clave extranjera y el padre fueran los mismo, y con esto se ha solucionado.

    Un saludo

  10. GravatarMichael Dice:

    Las dos posibilidades para que aslga este error son:

    1. Que el tipo de dato entre el padre y la clave foranea sean incompatibles

    2. O que este definido ON DELETE SET NULL cuando el campo no lo permite

    Gracias

Deja un comentario

XHTML: puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>