Symfony: Comment corriger l’erreur “Can’t create table (errno: 150)”?

Après avoir conçu le fichier schema.yml pour une application de jeux en ligne, j’ai été surpris par une erreur mysql 150 au moment quand j’ai exécuté “php symfony doctrine:build –all –and-load –no-confirmation”, l’idée était de pouvoir gérer les permissions par rapport à un concours et donner à un utilisateur X les droits pour le faire, la solution la plus naturel afin de l’intégrer avec sfDoctrineGuard est de créer une table avec une relation “many to many“, voici donc ce que contenait mon fichier schma.yml pour la table concernée :

[code]
################## Questions ##################
Concours:
columns:
id: { type: integer(4), primary: true, autoincrement: true}
name: string(250)
….
############ Gestion des Permissions ############
sfGuardConcoursUser:
columns:
user_id: { type: integer, primary: true}
concours_id: { type: integer, primary: true}
relations:
Concours: { local: concours_id, foreign: id, foreignAlias: sfGuardConcoursUserConcours, onDelete: CASCADE }
sfGuardUser: { local: user_id, foreign: id, foreignAlias: sfGuardConcoursUsersfGuardUser, onDelete: CASCADE }
[/code]

Problème

Après avoir fait un “php symfony doctrine:build –all –and-load –no-confirmation”, j’ai eu droit à cette erreur:

SQLSTATE[HY000]: General error: 1005 Can’t create table ‘test.#sql-529_3dab’ (errno: 150). Failing Query: “ALTER TABLE jeux_concours ADD CONSTRAINT jeux_concours_concours_id_user_id FOREIGN KEY (concours_id) REFERENCES concours

Solution?

Et Oui c’est l’une des erreurs qui m’ont fait chier pendant une heure pour trouver d’où ça provient, pour vous faire gagner du temps, voici la recette magique ;) :

Pour mysql les relations “many to many” doivent avoir toujours le même type et la même longueur des champs clés, vous remarquez bien que le champ Concours[id] est du type integer(4), par-contre dans la table sfGuardConcoursUser il est du type integer, il n’a donc pas la même longueur et c’est à cause de cette différence que l’erreur 150 s’est produite.

La solution est très simple, il suffit de mettre integer comme type pour le champ id de la table Concours au lieu de integer(4) et Bingo!

Happy coding

5 thoughts on “Symfony: Comment corriger l’erreur “Can’t create table (errno: 150)”?

  1. @Abderrahman, justement j’avais essayé ça avant, quand on ne spécifie pas le champ, il est par défaut considéré comme étant id: integer, étant données que dans l’autre table (Concours) j’avais id:integer(4) ça n’a pas marché, Mon conseil c’est d’éviter de spécifier la longeur des champs de type entier, toujours utiliser: integer ;)

  2. arf je cherchais depuis 2 heures… c’était vraiment con comme truc, merci beaucoup pour la soluce en tout cas ;)

Leave a Reply

Your email address will not be published. Required fields are marked *