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

InformationsquelleAutor mtpultz | 2015-02-17
Schreibe einen Kommentar