Solved: MySQL ERROR 1005: Can’t create table (errno: 150) (Foreign Key)

This is another stupid error. It has to do with trying to successfully set foreign keys in MySQL.

ERROR 1005: Can’t create table (errno: 150)

Great, that’s fantastic. Here’s an example of where this error will occur.

CREATE TABLE main(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE other(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
main_id INT NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(main_id) REFERENCES main(id)
);

So I’m trying to make the table “other” reference the table “main” through the foreign key “main_id” and, if you try it, it’ll throw an Error 150.

Want the solution?

The foreign key “main_id” has to have the exact same type as the primary key that it references. In the example, “main_id” in the table “other” has the type INT NOT NULL while “id” in the table “main” has the type “INT UNSIGNED NOT NULL” and also AUTO_INCREMENT, but that isn’t something we have to worry about. To make things incredibly clear, here’s the working example.

CREATE TABLE main(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE other(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
main_id INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(main_id) REFERENCES main(id)
);

To solve ‘MySQL ERROR 1005: Can’t create table (errno: 150)‘ you likely just have to ensure that your foreign key has the exact same type as the primary key. Hope it helps.

23 thoughts on “Solved: MySQL ERROR 1005: Can’t create table (errno: 150) (Foreign Key)”

    1. This might be another answer, though I haven’t tested it. If so, you can make sure your tables are INNODB by specifying in the CREATE TABLE statement:
      ENGINE=InnoDB;
      Or you can alter existing tables with this:
      ALTER TABLE my_table ENGINE = InnoDB;

  1. Espero esto le sirva a alguien, investigando sobre este error se produce por dibersas causas las principales que no cohinciden la llave primaria con la foranea, es decir tienen tipos diferentes, es decir int varchar etc, o tienen atributos diferentes como por ejemplo el unsigned o binary etc, si es el caso anterior se soluciona poniendo tanto llave primaria como foranea del mismo tipo las dos y con los mismos atributos, tambien es recomendado que sean de la misma longitud ya que si bien es sierto que la longitud no es tomada encuenta al momento de relacionar puede causar problemas al momento de pasar a la incercion de datos y demas dml.
    Otro motivo por el cual ocurre este error es por que esta repetido el nombre de campo
    es decir puede que en la bd ya haya un campo con el nombre id por lo que la solucion seria simplemente cambiar el nombre a id1 por ejemplo.

    otro motivo por el cual ocurre este error es el tipo demotor usado en las tablas es decir puede ser que una sea innodb y la otra myisam la solucion es que las dos deben ser del mismo tipo de motor.
    Por ultimo el motivo puede ser tambien el constrainter puede que este configurado como on delete set null y el campo noadmite valores nulos es decir es not null
    Como ya lo habia dicho espero le sirva a alguien esta info y si es asi pueden pegar el comentario en algun otro foro para ayudar a mas gente, saludos

  2. Thanks for writing such a good post to motivate the world to do some better things. Everyone have a cheap and but comfort zone where they feel relaxed. But there are rare people in the world accept the challenges and give something different what people looking for. I am sure people will enjoy your tips.

  3. Pingback: Google

  4. Pingback: URL

  5. Pingback: Google

  6. Pingback: Google

  7. Pingback: Google

  8. Pingback: Google

  9. Pingback: tottally free dating sites

  10. Pingback: Google

  11. Pingback: Top 7 Error 1005 Hy000 Can T Create Table The 27 Latest Answer

  12. Pingback: Mysql Errno 150? Top 7 Best Answers - Budget-template.com

  13. Pingback: Mysql Error 1005? Top 7 Best Answers - Budget-template.com

  14. Pingback: online pharmacies

  15. Pingback: madridbet

Leave a Comment

Your email address will not be published.