Laravel migration (errno: 150 “contrainte de clé Étrangère est mal formée”)
J'ai une table commandes et une sell_shipping_labels
les références orders.id
comme un étranger. Cependant quand je lance le Laravel migration-je obtenir le redouté code d'erreur:
[Éclairer\Database\QueryException]
SQLSTATE[HY000]: General error: 1005 ne Pouvez pas créer de tablecheapbooks_test
.#sql-b5b_b2a
(errno: 150 "contrainte de clé Étrangère est mal formée") (SQL: alter tablesell_shipping_labels
add constraintsell_shipping_labels_order_id_foreign
clé étrangère (order_id
) référencesorders
(id
))[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[HY000]: General error: 1005 ne Pouvez pas créer de tablecheapbooks_test
.#sql-b5b_b2a
(errno: 150 "contrainte de clé Étrangère est mal formée")
C'est mon orders
schéma de la table:
Schema::create('orders', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->integer('book_id');
$table->integer('status_id');
$table->double('payment_amount')->nullable();
$table->timestamp('received_at')->nullable();
$table->timestamp('paid_at')->nullable();
$table->timestamps();
$table->softDeletes();
});
Et c'est mon sell_shipping_labels
schéma:
Schema::create('sell_shipping_labels', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('order_id');
$table->string('shippo_object_id');
$table->string('label_url');
$table->string('tracking_url');
$table->string('tracking_number');
$table->timestamp('arrived_at');
$table->timestamps();
$table->softDeletes();
$table->foreign('order_id')->references('id')->on('orders');
});
}
Maintenant, je l'ai retournée à l'internet à l'envers à essayer de comprendre le problème. Tous les post sur ce problème toutes renvoient au fait que les commandes de la table doit être créé AVANT la table contenant la clé étrangère sur elle, mais ce n'est pas un problème pour moi parce que mes fichiers sont dans le bon ordre.
Vous devez vous connecter pour publier un commentaire.
Depuis
increments()
crée un entier non signé de la colonne, vous devez définir la colonne de clé étrangère en tant que nombre entier non signé de trop:Ou:
https://laravel.com/docs/5.5/migrations#foreign-key-constraints
la clé étrangère doit être un "unsignedBigInteger" et il sera résolu,
quelque chose comme ceci:
De clé primaire et de clé étrangère doit être dans le même type de données.
Si la clé primaire est d'utiliser unsigned
big_integer
, la clé étrangère doit également utiliser unsignedbig_integer
.En cas laravel 5.8 utilise
bigIncrements
par défaut lors de la génération de la nouvelle migration (voir ce pull request), vous devez vous assurer que votreforeign key
est égalementbig_increment
ou vous obtiendrez une erreur.Table
users
:Table
orders
:Espère que cette aide.
Laravel 5.8.3 est livré avec
$table->bigIncrements('id');
changer de
J'avais aussi le même message d'erreur. Ce que je faisais dans utilisateurs table est,
$table->unsignedInteger('role_id')->default(2);
table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
Mais j'ai créé le rôle de la table après la création de la table des utilisateurs. Donc, j'ai édité le rôle de la migration de nom de fichier avant la date de la table des utilisateurs date de nom de fichier. Comme ça,
2013_01_22_091213_create_roles_table.php
2014_10_12_000000_create_users_table.php
Et enfin, il fonctionne. Peut-être que parfois vous pouvez obtenir de ce problème. Donc, je l'ai posté.
Chèque à l'ordre de votre migrations. Si votre migrer de commande est d'essayer de rendre le sell_shipping_labels table avant de la table commandes, cela se produira avec MySQL. Il semble aller à créer de la date de migration, la plus ancienne à la plus récente. En d'autres termes, la order_id sur la table, il est tentant de référence ne devrait pas exister.
Que j'ai rencontré le même problème et j'ai changer de créer de la date de migration.
Pour tous ceux qui cherchent à présent à l'aide de laravel 5.8.x
J'ai résolu ce problème en modifiant
cette
à ce
Que c'est dû à l'utilisation de bigIncrements.
Vous pouvez supprimer chance bigIncrements à l'indexation sur les deux côtés de la relation
Pour ceux qui ont marqué la réponse n'a pas fonctionné:
Vérifier vos tables moteur. Dans mon cas, j'ai été référencement sur un MyISAM table dans un InnoDB de la table source. Après la modification de la table de référence moteur InnoDB, il a travaillé!
J'ai eu le même problème et résolu le problème de paramètre de type de base de données à
innoDB
Les tableaux créés avant la migration, où 'MyISAM à partir d'un système existant et migration sont
innoDB
par défaut, de sorte que le mélange de types de table ont été un problème dans mon cas.La plupart du temps la raison de cette erreur est généralement due à l'ordre dans lequel les fichiers de migration sont répertoriés ou l'erreur due à la conversion de type.
Assurez-vous toujours que la migration du fichier à l'étranger contraintes sont imposées sur vient après la migration parent.
Et pour ce dernier, assurez-vous que un unsignedBigInteger , bien que l'ancienne version de laravel (<5.4) pourrait ignorer ce type d'erreur de casting.
J'ai été confronté à ce problème aujourd'hui. J'ai vérifié toutes les solutions proposées telles que référencées clé et la clé étrangère même type de données, même classement dans le moteur de base de données et laravel config (database.php), de la date, de migrations et d'autres possibilités d'erreurs, mais ceux qui ont été ma solution!
dernière chose que j'ai trouvé était onUpdate et onDelete contraintes que mettre dans les migrations. En les enlevant mon problème est résolu!
J'ai connu le même problème aujourd'hui. Mon laravel version est 5.8.29. J'ai résolu le problème en faisant:
Espère que cela fonctionne.
Si le problème n'est toujours pas résolu, essayez-le.
vous avez besoin pour créer de la dernière table associée.
Vous devez d'abord créer des commandes et après créer sell_shipping_labels table
À résoudre le problème, vous devez renommer les fichiers de migration de la Catégorie et les Utilisateurs à la date de l'avant les Repas fichier de Migration que la création de ces avant les Repas table.
J'ai été confronté à ce problème aujourd'hui. Mes parents clé primaire de la table type de données et la table d'enfant type de données est la même, mais l'erreur est toujours là. J'ai trouvé que mes tables parent et enfant moteur de stockage était différent. J'ai résolu ce problème en faisant les deux tables moteur de stockage InnoDB de mon phpmyadmin.
Pour laravel 6+ utilisateurs, je suis d'accord avec les 2 réponses à ses tout dépend de laravel versions, l'une Pour les versions les plus récentes des utilisateurs
id
colonne utilisebig integer
. Afin de référencer les utilisateursid
à partir du cours de la migration, vous devez utiliserunsignedBigInteger
comme une clé de référence.Soufflet est un exemple de migration pour laravel 6.5.*, Chaque fois que nous attribuons
foreign key
Garder à l'esprit de votre actuel laravel version