Categorías: Tutoriales

Error en MySQL: Can’t create table ‘xxx’ (errno: 150)

Soy de los que piensa que MySQL (o MariaDB si queréis algo no dependiente de Oracle) es una gran base de datos incluso para desarrollos serios y lo pongo en negrita porque todavía hoy me encuentro con muchos que defienden alternativas como Oracle DB o PostgreSQL para aplicaciones más complejas y MySQL para aplicaciones más sencillas.

Una de las características que debe tener todo modelo relacional medianamente serio, es el uso de claves foráneas que deben ir especificadas en la construcción de las diferentes tablas de forma que conozcan que campos hacen referencia a qué otros campos. Esto con InnoDB es perfectamente posible en MySQL.

Aquí tenéis la documentación y un ejemplo de cómo crear restricciones de clave foránea de MySQL:

CREATE TABLE padre(
  id INT NOT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE hijo(
  id INT, 
  id_padre INT,
  INDEX par_ind (id_padre),
  FOREIGN KEY (id_padre) 
    REFERENCES padre(id) 
    ON DELETE CASCADE
) ENGINE=INNODB;

El ejemplo es sencillo pero a la vez muy común, es muy frecuente tener una tabla hija que haga referencia al id de su tabla padre: por ejemplo el típico ejemplo de factura y línea factura.

Error: Can’t create table ‘xxx’ (errno: 150)

Haciendo algo similar a esto, esta mañana he sufrido un error (el del título) que nunca antes me había pasado. He empezado a comprobar y tras dar muchas vueltas he dado con el fallo: los dos tipos de datos deben ser idénticos.

Y cuando idénticos digo: mismo tipo de datos, misma longitud, signed o unsigned los dos, si es not null igual el otro.

Esto es lo lógico pero a mí se me había escapado un detalle, uno era signed y el otro unsigned y he perdido unos minutos hasta dar con el error (tras la primera y típica reacción “será problema de MySQL”).

F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Ver comentarios

  • Hay un error en tu descripción de la causa del error 150. Efectivamente los tipos de datos para la clave foránea y la clave primaria a la que hace referencia deben ser indénticos, excepto en lo relativo a admitir o no nulos. La clave primaria, de hecho, no prodrá admitirlos nunca mientras que la clave foránea puede admitirlos o no, según convenga.
    Un saludo.

    • Gracias por la aclaración, tienes toda la razón del mundo:
      * La clave primaria siempre deberá ser NOT NULL por definición
      * La clave foránea, podrá serlo o no, según se necesite

Entradas recientes

DeepSeek

2 días hace

Contacto

2 semanas hace

Smart-tv mute

2 semanas hace

STEAM OS

3 semanas hace

2025

4 semanas hace

El podcast de Linux Hispano – #072 – El hardware libre debe consolidarse como el software libre

https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.

1 mes hace