“Erreur générale: 1005 ne Pouvez pas créer de table” à l'Aide de Laravel Schéma de Construire et les Clés Étrangères
Essentiellement, je vais avoir le même problème que ce gars-là, moins le préfixe de la table. Parce que je n'ai pas de préfixe de la table, sa solution ne fonctionne pas. http://forums.laravel.com/viewtopic.php?id=972
Je suis en train de construire un tableau à l'aide de Laravel du Générateur de Schéma comme ceci:
Schema::create('lessons', function($table)
{
$table->increments('id');
$table->string('title')->nullable();
$table->string('summary')->nullable();
$table->timestamps();
});
Schema::create('tutorials', function($table)
{
$table->increments('id');
$table->integer('author');
$table->integer('lesson');
$table->string('title')->nullable();
$table->string('summary')->nullable();
$table->string('tagline')->nullable();
$table->text('content')->nullable();
$table->text('attachments')->nullable();
$table->timestamps();
});
Schema::table('tutorials', function($table)
{
$table->foreign('author')->references('id')->on('users');
$table->foreign('lesson')->references('id')->on('lessons');
});
Le problème est que quand j'exécute ce code (dans une installation /de route), j'obtiens l'erreur suivante:
SQLSTATE[HY000]: General error: 1005 Can't create table 'tutorials.#sql-2cff_da' (errno: 150)
SQL: ALTER TABLE `tutorials` ADD CONSTRAINT tutorials_author_foreign FOREIGN KEY (`author`) REFERENCES `users` (`id`)
Bindings: array (
)
Basé sur des postes à travers le web et le peu de documentation disponible sur la façon de installation Laravel est Éloquent relations, je ne suis pas sûr de ce que je fais mal...
users
existe déjà et il ne ont un id
champ auto_increment
. Je suis également la mise en place de mes modèles avec les bonnes relations (belongs_to
et has_many
), mais aussi loin que je peux dire c'est pas la question, c'est la configuration de base de données. La DB est InnoDB.
Exactement ce que je fais mal avec la clé étrangère?
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr à 100% si ce sont les raisons de cet échec, mais un couple de pointeurs. Si vous utilisez une ancienne version de mySQL comme base de données, la valeur par défaut de la table de la mise en œuvre est myISAM qui ne supporte pas les contraintes de clé étrangère. Que vos scripts à défaut sur la clé étrangère d'affectation, vous êtes mieux indiquant explicitement que vous souhaitez INNODB comme le moteur à l'aide de cette syntaxe dans le Schéma de la méthode de création.
Cela devrait atténuer les problèmes que vous rencontrez.
Aussi, alors que vous pouvez déclarer des clés étrangères comme une réflexion après coup, j'ai créer les clés étrangères dans le schéma que je peux faire une simple vérification pour s'assurer que j'ai eu le droit DB moteur de jeu.
Espère que cette aide /permet de résoudre votre problème.
user.id
champ est unint(10) unsigned
, alors que les clés étrangères ont étéint(11)
. Merci pour les suggestions bien 🙂J'ai eu le même problème. Je viens de remarquer la note suivante au bas de la Laravel Schéma docs:
Pour moi, dès que j'ai mis mon champs de clé étrangère en tant que telle:
Je n'ai eu aucun problème.
EDIT: Aussi, assurez-vous que les champs de la table étrangère sont déjà créés, sinon cela peut échouer avec le même message d'erreur.
->nullable()
; après->unsigned();
et il a bien fonctionné 🙂->unsigned()
toujours, et ajouter->nullable()
si votre onDelete action est définie sur 'set null'->onDelete('set null')
Un Résumé des réponses déjà inscrit, plus la mienne:
Clés étrangères exigent généralement
InnoDb
, alors réglez votre moteur par défaut ou spécifier explicitementClés étrangères exigent la table référencée à exister. Assurez-vous que la table référencée est créé dans une version antérieure de la migration, avant la création de la clé. Envisager de créer les clés dans un distinct sur la migration pour être sûr.
Clés étrangères exigent le type de données pour être en harmonie. Vérifiez si le champ référencé est le même type, s'il est signé ou non signé, si la longueur est la même (ou moins).
Si vous êtes à la commutation entre la main-codage des migrations, et à l'aide de générateurs, assurez-vous de vérifier le type d'id que vous utilisez. Artisan utilise incrémente() par défaut, mais Jeffrey Manière semble préférer entier('id', true).
increments()
dans Jeffrey du générateur.Je suis tombé sur cette question aussi.
La solution que j'ai trouvé, c'est que les tables qui contiennent l'id qui est utilisé étrangère id doit être créé avant une autre table peut faire référence à elle. En gros, vous créez une table et de dire à MySQL de faire référence à une autre table de la clé primaire, mais que la table n'existe pas encore.
Dans votre exemple, l'auteur et la leçon de tables doivent être créés en premier.
L'ordre dans lequel les tables sont créées dépend de l'artisan et l'ordre que vous avez créé vos fichiers de migration.
Mon avis, serait de vider votre base de données de toutes les tables et de modifier le timestamp dans la migration des noms de fichiers (ou de les supprimer et les recréer dans le bon ordre), de sorte que votre auteur et la leçon de tables sont créées à l'avant de votre tutoriels table.
J'ai reçu le même message d'erreur parce que j'ai oublié de définir le type de table InnoDB sur la table référencée:
Laravel5, MySQL55, CentOS65
dans mon cas, les erreurs étaient même chose que ce.
J'ai trouvé une bonne astuce à ce problème approuvé réponse:
ERREUR: Erreur 1005: ne Peut pas créer de table (errno: 121)
dans mon cas, cette erreur signifie que la contrainte qui a été essayé à ajouter existe déjà quelque part (mais je ne pouvais pas voir n'importe où).
J'ai copié la sortie d'erreur de la requête et de l'exécuter dans sequel pro, puis j'espère que j'ai vu la même erreur à nouveau. le conseil dit que j'ai changé le nom de la contrainte à autre chose, puis il a touché à aucune erreur, donc il y a un problème avec le nom de la contrainte builder dans laravel5 + MySQL55 + CentOS65.
Solution: essayez de renommer contraintes par l'envoi de la deuxième paramètre à l'étranger méthode dans le schéma de la table.
à ->
j'espère que cela aide. il fonctionne dans mon cas
Ce qui m'est arrivé dans Yii Framework 1.x les migrations de trop. S'est avéré que
de même pour le Laravel solutions ci-dessus, il peut être provoqué par un
lors de l'utilisation de clé étrangère-s assurez-vous que votre clé étrangère est
unsigned
. cela a fonctionné pour moiFaçon la plus simple est de désactiver le contrôle des clefs étrangères:
Voici ce que je fais dans Laravel 5:
C'est tout pour la conclusion, et cela fonctionne pour moi.
Vous devrez donner le un entier non signé drapeau dans Laravel 5.4, comme ceci: