Laravel 5 Migration Fehler im Zusammenhang mit Ausländischen Key
Dies ist ein Versuch, zu lernen, Laravel (insbesondere v5.x) durch die Portierung von einem alten Projekt mit einem SQL-dump, enthält diese:
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 ;
Und am unteren Rand der Müllkippe hatte dieser mit diesem bestimmten Tabelle:
ALTER TABLE `user`
ADD CONSTRAINT `location_userfk` FOREIGN KEY (`locationid`) REFERENCES `location` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
Aus ein paar stackoverflow Fragen Eins, Zwei, Drei; habe ich verändert mein original-code (split out) der Fremdschlüssel Schema::Tabelle aus dem Schema::create und Hinzugefügt unsigned() auf jedes der Felder:
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');
});
}
Aber ich bekomme immer noch eine Fehlermeldung, wenn ich migrieren, wenn Sie mit einer leeren neu erstellten 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))
Welche nach MySQL bedeutet:
Error: 1215 SQLSTATE: HY000 (ER_CANNOT_ADD_FOREIGN)
Message: Cannot add foreign key constraint
Nach was kann ich nicht rollback oder migrieren Sie Sie wieder ohne eine andere Art von Fehler in Bezug auf die Existenz der Benutzer-Tabelle bereits in der DB, so dass jedes mal, wenn ich versuche, eine version des obigen code, den ich habe fallen meine DB jedes mal.
Ich bin mir sicher, dass nach der Festlegung dieser tritt es in allen anderen Tabellen, welche ähnlich oder mehr als eine foreign key-also hoffentlich, was dies behebt, wird die Arbeit für den rest.
- Ist die
location
Tabelle schon erstellt wurde? - Sie müssen zum erstellen von Standort-Tabelle, bevor Sie den Fremdschlüssel.
- Für mich erkläre ich die migration-Dateien. Und dann verwenden Sie die artisan migrate-Befehle zu generieren, neue Migrationen.
- wie definieren Sie die Reihenfolge der Tabellen migriert wird? Es sieht aus wie Sie vielleicht nur in der Lage sein, dies zu tun, indem Sie eine migration-Datei und das erstellen mehrere Tabellen in einer Datei, oder speziell, schneidern Sie die erste migration, das würde schwieriger sein, für andere devs zu imitieren. Hatte gehofft, in der Lage sein, zu installieren, zu erstellen db, composer installieren, artisan migrate und Handwerker Samen zu bekommen, andere devs und läuft
- Für mich erkläre ich die Dateien
2014_10_29_[1...100]_create...
und dann habe ich keine weitere anlegen migration-Datei über das artisan Kommando. - Ich sehe, danke
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Fehler wird verursacht durch die migration, die versucht, die Referenz auf eine nicht vorhandene Spalte. Um dieses Problem zu verhindern erstellen Sie eine Spalte, bevor Sie die foreign key-Erstellung.
Erstellen-Tabellen-Strukturen mit Abhängigkeiten, die Sie können entweder erstellen Sie die migration-Dateien in der richtigen Reihenfolge, oder setzen Sie alle Migrationen in eine große Datei oder zumindest alle Tabellen ohne Fremdschlüssel und erstellen Sie eine weitere Datei, die führt die Schlüssel-Erzeugung in das Ende. Halten Sie in mind dies ist nur erforderlich, wenn Sie möchten Reskript eine bestehende Daten-Struktur oder fixieren möchten, die migration um. Andernfalls verwenden Sie die
php artisan make:migration
Befehl.Ändern Sie die Migrationen um
Werden sollte:
Schließlich:
Ich hatte das gleiche problem, was habe ich getan?
einfach... in Ihrer
create_users
migration-Datei versuchen Sie dies....🙂
Gut, seinen kleinen Teil verwirrend hier, erstellen Sie zunächst eine Tabelle('users'), wenn die Methode ausgeführt und dann jeweils update table('Benutzer'), indem Fremdschlüssel in derselben Tabelle. Ich denke, die können nicht ausgeführt werden zur gleichen Zeit hinzufügen und aktualisieren Sie mithilfe der migration.
Für die Lösung des Codes wäre:
Nun, Sie erstellen Ihre ausländischen, indem Sie für Ihre Tabelle. also seinen sollte funktionieren, wenn nicht lass es mich wissen.