Laravel 5 Migration Erreur en relation de Clé Étrangère
C'est une tentative d'apprendre Laravel (plus précisément v5.x) par le portage d'un vieux projet à l'aide d'un dump SQL qui contient ceci:
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`locationid` int(11) NOT NULL,
`username` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
`email` varchar(200) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
`firstname` varchar(100) NOT NULL,
`lastname` varchar(100) NOT NULL,
`password` varchar(255) NOT NULL,
`active` bit(1) DEFAULT b'1',
`token` varchar(100) DEFAULT NULL,
`token_created` timestamp NULL DEFAULT NULL,
`role` varchar(45) NOT NULL DEFAULT 'user',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `email_UNIQUE` (`email`),
UNIQUE KEY `username_UNIQUE` (`username`),
KEY `location_idx` (`locationid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
Et au bas de la décharge a ce lié à ce tableau:
ALTER TABLE `user`
ADD CONSTRAINT `location_userfk` FOREIGN KEY (`locationid`) REFERENCES `location` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
À partir d'un couple stackoverflow questions Un, Deux, Trois; j'ai modifié mon code d'origine pour séparer la clé étrangère de Schéma::table de Schéma::créer et ajouté unsigned() pour chacun des champs:
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->integer('locationid')->unsigned();
//$table->foreign('locationid')->references('id')->on('location');
$table->string('username', 60)->unique();
$table->string('email', 200)->unique();
$table->string('firstname', 100);
$table->string('lastname', 100);
$table->string('password', 255);
$table->boolean('active')->default(TRUE);
$table->string('role', 45)->default('user');
//$table->string('token', 255)->nullable()->default(NULL);
//$table->string('token_create')->nullable()->default(NULL);
$table->rememberToken();
$table->timestamps();
});
Schema::table('users', function(Blueprint $table)
{
$table->foreign('locationid')->references('id')->on('location');
});
}
Mais j'ai toujours une erreur quand j'ai migrer lors de l'utilisation d'un vide nouvellement créé DB:
exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint' in /home/vagrant/projects/communityfuturesbc/vendor/laravel/framework/src/Illuminate/Database/Connection.php:358
Stack trace:
#0 /home/vagrant/projects/communityfuturesbc/vendor/laravel/framework/src/Illuminate/Database/Connection.php(358): PDOStatement->execute(Array) etc...
Next exception 'Illuminate\Database\QueryException' with message 'SQLSTATE[HY000]: General err
or: 1215 Cannot add foreign key constraint (SQL: alter table `users` add constraint users_loca
tionid_foreign foreign key (`locationid`) references `location` (`id`))' in /home/vagrant/proj
ects/communityfuturesbc/vendor/laravel/framework/src/Illuminate/Database/Connection.php:614
Stack trace:
#0 /home/vagrant/projects/communityfuturesbc/vendor/laravel/framework/src/Illuminate/Database/Connection.php(570): Illuminate\Database\Connection->runQueryCallback('alter table `us...', Ar
ray, Object(Closure))
Qui, selon MySQL signifie:
Error: 1215 SQLSTATE: HY000 (ER_CANNOT_ADD_FOREIGN)
Message: Cannot add foreign key constraint
Après laquelle je ne peux pas rollback ou de migrer de nouveau sans avoir à obtenir un autre type d'erreur quant à l'existence de la table des utilisateurs déjà dans la base de données de sorte que chaque fois que j'essaie une version du code ci-dessus, j'ai été déposer mon DB à chaque fois.
Je suis sûr que, après la fixation de ce qu'il va se produire dans tous les autres tableaux, qui sont similaires ou avoir plus d'une clé étrangère, alors j'espère que ce que résout ce travail pour le reste.
- Est le
location
tableau déjà créé? - Vous devez créer emplacement de la table avant d'ajouter la clé étrangère.
- Pour moi, je énumérer la migration des fichiers. Et puis utiliser l'artisan migrer les commandes pour générer de nouvelles migrations.
- comment définissez-vous l'ordre des tables en cours de migration? Il semble que vous ne pourrions le faire en faisant un seul fichier de migration et de créer plusieurs tables dans un seul fichier, ou plus précisément l'adaptation de la migration initiale, ce qui serait plus difficile pour les autres développeurs à imiter. A été l'espoir d'être en mesure d'installer, de créer db, compositeur installer, artisan de migrer et de l'artisanat de la graine pour obtenir d'autres devs et en cours d'exécution
- Pour moi, je énumérer les fichiers
2014_10_29_[1...100]_create...
puis-je créer la poursuite de la migration de fichiers via l'artisan de commande. - Je vois, merci
Vous devez vous connecter pour publier un commentaire.
L'erreur est provoquée par la migration, qui tente de référence sur un non-existence de la colonne. Pour éviter ce problème créer colonne référencée avant d'effectuer la clé étrangère de la création.
Pour créer des structures de table avec des dépendances, vous pouvez créer les fichiers de migration dans le bon ordre, ou de mettre toutes les migrations dans un grand dossier ou, au moins, créer toutes les tables sans les clés étrangères et de créer un autre fichier qui effectue la clé de la création à la fin. Gardez à min ce n'est nécessaire que si vous souhaitez rescrit une structure de données existantes ou voulez corriger la migration de l'ordre. Sinon l'utilisation de la
php artisan make:migration
commande.Vous devez changer les migrations afin
Devrait être:
Enfin:
J'ai eu le même problème, qu'ai-je fait?
simple... dans votre
create_users
fichier de migration de l'essayer....🙂
Bien, son peu déroutant partie ici, d'abord créer une table('utilisateurs') lorsque la méthode d'exécution, puis respectivement la mise à jour de la table('utilisateurs') par adjonction, dans la clé Étrangère dans la même table. Je pense que sa ne peut pas effectuer dans le même temps, ajouter et mettre à jour à l'aide de la migration.
Pour la solution de votre code serait:
Maintenant, à vous de créer votre étrangères par la création de votre table. donc sa devrait fonctionner si non faites le moi savoir.
Assurez-vous que votre emplacement table existe en premier. Le référencement d'un non-existence de table peut provoquer l'erreur que vous rencontrez.