Je dois utiliser une clé étrangère pour ma base de données mais je ne peux pas le faire. Après avoir exécuté la commande de migration en ligne de commande, le message d'erreur suivant s'affiche:
[Illuminate\Database\QueryException] SQLSTATE [HY000]: Erreur générale: 1215 Impossible d'ajouter une contrainte de clé étrangère (SQL: modifier la table
samples
ajouter Contrainte sitters_supplier_id_foreign clé étrangère (supplier_id
) .__ référencessuppliers
(id
)[PDOException] SQLSTATE [HY000]: Erreur générale: 1215 Impossible d'ajouter contrainte de clé étrangère
Migration des échantillons:
Schema::create('samples', function (Blueprint $table) {
$table->Increments('id',true);
$table->string('variety',50);
$table->integer('supplier_id')->unsigned();
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->string('lot_number');
$table->date('date');
$table->integer('amount');
$table->integer('unit_id')->unsigned();
$table->foreign('unit_id')->references('id')->on('unit');
$table->string('technical_fact');
$table->string('comments');
$table->string('file_address');
$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('category');
$table->timestamps();
});
Migration du fournisseur:
Schema::create('suppliers', function (Blueprint $table) {
$table->Increments('id',true);
$table->string('supplier',50);
$table->timestamps();
});
J'essaie de le faire avec une nouvelle migration pour les échantillons, mais sans succès:
Schema::create('samples', function (Blueprint $table) {
$table->Increments('id',true);
$table->string('variety',50);
$table->integer('supplier_id')->unsigned();
$table->string('lot_number');
$table->date('date');
$table->integer('amount');
$table->integer('unit_id')->unsigned();
$table->string('technical_fact');
$table->string('comments');
$table->string('file_address');
$table->integer('category_id')->unsigned();
$table->timestamps();
});
Schema::table('samples', function($table) {
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->foreign('unit_id')->references('id')->on('unit');
$table->foreign('category_id')->references('id')->on('category');
});
J'essaie de fixer la longueur de la clé primaire à 10, mais j'échoue à nouveau
L'ordre compte.
Vous voulez vous assurer que votre table "fournisseurs" existe avant de tenter de référencer une colonne de cette table en tant que contrainte.
Donc, si vous voulez définir votre contrainte de clé étrangère lors de la création de votre table, assurez-vous d’abord de créer la migration " fournisseurs ", puis la migration " échantillons ":
php artisan make:migration create_suppliers_table --create=suppliers
php artisan make:migration create_samples_table --create=samples
... ajouter du code de schéma à vos fichiers de migration. et alors:
php artisan migrate
Si vous ne souhaitez pas vous soucier de l'ordre dans lequel les tables sont créées, effectuez d'abord vos migrations create_table, sans les contraintes de clé étrangère, puis effectuez une migration supplémentaire pour ajouter vos clés étrangères.
php artisan make:migration create_samples_table --create=samples
php artisan make:migration create_suppliers_table --create=suppliers
php artisan make:migration alter_samples_table --table=samples <-- add your foreign key constraints to this migration file
... ajouter du code de schéma à vos fichiers de migration. Et migrez ensuite avec:
php artisan migrate
Enfin, générez une migration pour la table en gardant à l’esprit qu’ils devraient être en ordre si vous sentez une difficulté nommer simplement ur table_foreign_keys
Schema::table('samples', function($table) {
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->foreign('unit_id')->references('id')->on('unit');
$table->foreign('category_id')->references('id')->on('category');
});
placer toutes les clés étrangères liées enfin ici et courir
essayez comme ça
Schema::table('samples', function($table) {
$table->integer('supplier_id')->unsigned();
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->integer('unit_id')->unsigned();
$table->foreign('unit_id')->references('id')->on('unit');
$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('category');
});
KorreyD dit vrai! , mais j’ai créé des migrations, puis renommé la migration pour les réorganiser, c’est si simple:
Avant d'être renommé:
Migration du fournisseur: 2015_08 _ 21 _ 104217_supllier_table.php
Migration des échantillons: 2015_08 _ 22 _ 102325_samples_table.php
Après avoir renommé:
Migration des échantillons: 2015_08 _ 21 _ 102325_samples_table.php
Migration du fournisseur: 2015_08 _ 22 _ 104217_supllier_table.php
mon problème résolu! parce que la migration des fournisseurs a eu lieu avant la migration des échantillons
Commentaire: J'essaie ceci avec un réflecteur, qui a renommé n'importe quel endroit qui utilise le nom de la migration
Schema::table('posts', function (Blueprint $table) {
$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
});