laravel errno 150 contrainte de clé étrangère est mal formée
Quelqu'un peut-il m'aider à résoudre ce problème?
Il y a 3 tables avec 2 clés étrangères:
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Schema::create('firms', function (Blueprint $table) {
$table->increments('id');
$table->string('title')->nullable();
$table->integer('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
});
Schema::create('jobs', function (Blueprint $table) {
$table->increments('id');
$table->string('title')->nullable();
$table->integer('firm_id')->unsigned()->nullable();
$table->foreign('firm_id')->references('id')->on('firms');
$table->timestamps();
});
D'erreur après l'exécution de la migration:
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1005 Can't create table `job`.`#sql-5fc_a1`
(errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter ta
ble `firms` add constraint `firms_user_id_foreign` foreign key (`user_id`)
references `users` (`id`))
[PDOException]
SQLSTATE[HY000]: General error: 1005 Can't create table `job`.`#sql-5fc_a1`
(errno: 150 "Foreign key constraint is incorrectly formed")
Désolé, ça ne fonctionne pas: Schema::create('entreprises', function (Plan $tableau) { $table->incrémente('id')->unsigned(); Schéma::create('emplois', function (Plan $tableau) { $table->incrémente('id'); $table->entier('firm_id')->unsigned(); $table->étrangères('firm_id')->références('id')-> ('entreprises');
et ce n'est pas trop d': Schema::create('entreprises', function (Plan $tableau) { $table->incrémente('id'); Schéma::create('emplois', function (Plan $tableau) { $table->incrémente('id'); $table->entier('firm_id'); $table->étrangers('firm_id')->références('id')-> ('entreprises');
et ce n'est pas trop d': Schema::create('entreprises', function (Plan $tableau) { $table->incrémente('id'); Schéma::create('emplois', function (Plan $tableau) { $table->incrémente('id'); $table->entier('firm_id'); $table->étrangers('firm_id')->références('id')-> ('entreprises');
OriginalL'auteur Yrtymd | 2016-11-29
Vous devez vous connecter pour publier un commentaire.
Dans le cas de clés étrangères, de la référence et du référencement champs doivent avoir exactement le même type de données.
Vous créez le
id
champs dans les deuxusers
etfirms
comme signé entiers. Toutefois, vous devez créer deux clés étrangères comme unsigned entiers, par conséquent, de la création de l'clés de l'échec.Vous devez ajouter le
unsigned
clauseid
définitions de champ, ou de retirer launsigned
clause de champs de clé étrangère.Oubliez tous les autres chose a dit que c'est important
the referenced and referencing fields must have exactly the same data type.
j'ai presque été d'aller me pendre. Merci s'accoupler.OriginalL'auteur Shadow
La plupart du temps ce genre d'erreur se produit en raison de la type de données incompatibilité sur la table.
À la fois la clé primaire de la table & clé étrangère de la table doivent utiliser le même type de données et la même option.
Par exemple:
utilisateurs
commandes
Sur l'exemple ci-dessus, je suis en train d'attribuer des clés étrangères pour les utilisateurs de tableau de commande de la table, mais j'ai bigInteger datatable dans le tableau de commande alors que dans la table user, j'ai simple entier. C'est pourquoi il est permis de générer ce type d'erreur.
Aussi, Si vous avez utilisé non signé(), nullable() etc options primaires ou de clé étrangère, alors vous devriez utiliser le même à la fois le lieu.
OriginalL'auteur Mayank Dudakiya
En outre, lors de la déclaration de clés étrangères dans laravel toutes les tables de votre renvoi doit être sur le dessus. Dans ce cas, vous pouvez utiliser "->unsigned()" modificateur..
Comme vous pouvez le voir table "users" était sur le dessus, et la caisse est "clé étrangère", qui fait référence à la table "users" même avec l'étudiant. Il suffit de garder votre table organisé lors de la création de la migration.
OriginalL'auteur Louie Guides
nous sommes tableau villes:
de clé étrangère dans la table des utilisateurs, par exemple :
OriginalL'auteur Saad Tejda
Cette réponse n'est pas mieux que les six réponses avant elle, mais elle est plus complète de réponse sur les causes de
laravel-errno-150-foreign-key-constraint-is-incorrectly-formed
et comment les corriger spécifiquement pour laravel.1) Orthographe : souvent à la fois une mauvaise orthographe de référence
column name
ou référencétable name
peut jeter cette erreur et vous ne savez pas que la trace de l'erreur n'est pas très descriptif.2) Unique : la colonne référencée doit être unique, soit par l'ajout de
->primary()
ou l'ajout de->unique()
à la définition de la colonne dans votre migration.3) type de Données : la référence et le référencement de champs doivent avoir exactement le même type de données. cela ne peut pas être assez souligné.
pour
bigincrements
attendu le type de données estbigInteger('column_name')->unsigned();
pour
increments
attendu estinteger('column_name')->unsigned();
etc.4) Restes : lorsque cette erreur se produit, cela ne signifie pas que la table n'est pas migré c'est plutôt migré, mais les colonnes de clé étrangère ne sont pas définies et il n'est pas ajouté à la
migration table
donc l'exécution dephp artisan migrate:reset
supprimera les autres tables à l'exception de la mauvaise tables, donc un manuel de baisse de la mauvaise table est recommandé d'éviter de nouvelles erreurs.5) Ordre : c'est souvent les plus habituelles de la cause de cette erreur de la table
referenced
doivent être créés ou transférés avant lareference table
autre artisan ne trouverez pas où intégrer la clé étrangère. pour assurer une commande pour le processus de migration de renommer le fichier de migration exemple:2014_10_12_000000_create_users_table.php
et2014_10_12_100000_create_password_resets_table.php
Cela indique que la Table A toujours avant le Tableau B pour changer les choses, je vais renommer le Tableau B de la
2014_10_11_100000_create_password_resets_table.php
maintenant, il va migrer avant le Tableau A.6) Permettre de Clé Étrangère : si tout le reste échoue, puis ajouter
Schema::enableForeignKeyConstraints();
à l'intérieur de votrefunction up()
avant votre migration exemple de code:Pour lire la suite voir laravel de clé étrangère et laravel migrations
Mentionner plus de bugs que j'ai raté dans les commentaires merci.
OriginalL'auteur Bobby Axe
Ce qui se passe quand vous testez votre application laravel et vous avez utilisé une instance de MySQL dans vos tests qui est soumise à des migrations de base de données.
Avant d'exécuter le test, mon migrations, beau travail. Puis j'ai rencontré cette erreur.
La façon dont j'ai résolu ce problème était simplement déposer l'ensemble de la base de données et re-créer. Ensuite migrer de nouveau.
OriginalL'auteur Uriah Galang
si vous définissez le référencement des champs et ont exactement le même type de données, mais l'erreur existe
vous pouvez changer la date de migration de fichiers
juste son travail
OriginalL'auteur Ehab Elzeny