2015-07-02 26 views
10

próbuję uruchomić migrację (patrz niżej) i nasion bazy danych, ale gdy uruchamiamlaravel 5,1 Migracja i sadzenie Nie można obciąć tabelę odwołuje się w klucz obcy

php artisan migrate --seed 

otrzymuję ten błąd :

Migration table created successfully. 
Migrated: 2015_06_17_100000_create_users_table 
Migrated: 2015_06_17_200000_create_password_resets_table 
Migrated: 2015_06_17_300000_create_vehicles_table 

[Illuminate\Database\QueryException] 
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table 
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic 
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id` 
)) (SQL: truncate `users`) 

[PDOException] 
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table 
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic 
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id` 
)) 

Spojrzałem w górę, co ten błąd ma na myśli, a także znaleźć examples innych osób prowadzących do tego samego problemu, choćby związane z użyciem MySQL i ich rozwiązania, ale zastosowanie:

DB::statement('SET FOREIGN_KEY_CHECKS=0;'); and 
DB::statement('SET FOREIGN_KEY_CHECKS=1;'); 

W dół() wydaje się nie działać i po uruchomieniu opisać w MySQL tabele wyglądają dobrze.

Migracja została poprawnie nazwana, aby upewnić się, że tabela użytkowników została najpierw poddana migracji, a następnie pojazdy, aby można było zastosować klucz obcy, a konfigurowane tabele prawidłowo sugerują, że migracje zostały uruchomione, ale wystąpił błąd. Rzuciłem i odtworzyłem DB i próbowałem go ponownie i jest to ten sam rezultat. Nie rozumiem również, dlaczego próbuje on skrócić pierwszą migrację i seed bazy danych, nie sądziłem, że wystąpi, gdy spróbujesz uruchomić php artisan migracja: refresh - seed.

// 2015_06_17_100000_create_users_table.php 

class CreateUsersTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('users', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->string('username', 60)->unique(); 
      $table->string('email', 200)->unique(); 
      $table->string('password', 255); 
      $table->string('role')->default('user'); 
      $table->rememberToken(); 
      $table->timestamps(); 
     }); 
    } 
} 

public function down() 
{ 
    Schema::drop('users'); 
} 

// 2015_06_17_300000_create_vehicles_table.php 

class CreateVehiclesTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('vehicles', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('user_id')->unsigned(); 
      $table->string('make'); 
      $table->string('model'); 
      $table->string('year'); 
      $table->string('color'); 
      $table->string('plate'); 
      $table->timestamps(); 

      $table->foreign('user_id')->references('id')->on('users'); 
     }); 
    } 
} 

public function down() 
{ 
    Schema::drop('vehicles'); 
} 
+1

Próbuje wysiać bazę danych podczas pierwszej migracji, ponieważ przekazuje się opcję '--seed'.Twoje migracje są w porządku, problem polega na wysiewaniu. Czy możesz dodać kod do siewnika stołów samochodowych? – user3158900

+1

Można również spróbować 'delete()' 'zamiast skróconej()'. To powinno działać. – user3158900

+1

Hi @ user3158900, znalazłem go w DatabaseSeeder. Dodałem zamiast tego dodane usuwanie() i działa. Jeśli napiszesz jako odpowiedź, zaznaczę to jako poprawne. – mtpultz

Odpowiedz

22

Jak informuje błąd, nie można skracać tabel przywoływanych przez klucze obce. Usuwanie powinno działać chociaż ...

DB::table('some_table')->delete(); 
20
DB::statement('SET FOREIGN_KEY_CHECKS=0;'); 
App\User::truncate(); 
DB::statement('SET FOREIGN_KEY_CHECKS=1;'); 

to praca

+0

Niestety to działa tylko w MySQL. – LePhleg

+1

Pomijanie sprawdzania klucza obcego jest bardzo złą praktyką. obcinania resetuje autoinkrementacja identyfikator na przykład, więc wasze stosunki będą źle Od tego momentu – CommonToast

+0

@CommonToast Zgadzam się z Tobą, gdy mówimy o prawdziwych danych światowych, że jest złą praktyką, ale w projekcie greenfield, może to pomoc przy tworzeniu migracji i nasion. Jak można naprawić osieroconych danych z pełnymi ograniczeń, jeżeli mogą one mieć miejsce w dużym i środowisku wielu schemacie? – Semo

2

Do cleartable użyciu Eloquent:

Model::query()->delete(); 

Przykład użyciu domyślnego modelu użytkownik

User::query()->delete(); 
0

Oto, co działa dla mnie za każdym razem. Dodając klucz obcy, dodaj: cascade. składnia jest jak ten

$table->foreign('column')->references('id')->on('table_name')->onDelete('cascade'); 

Upewnij zastąpić id ze cokolwiek pole jest stosowane dla Ciebie.

Teraz przed uruchomieniem siew dodać to zamiast trucate

DB::statement('DELETE FROM table_name'); 

usunie wszystkie dane. Mam nadzieję, że to pomoże.

0

można użyć

DB::table('your_table_name')->delete(); 

opróżnić tabelę, to nie usunie strukturę tabeli. Ale identyfikator automatycznego przyrostu nie rozpocznie się od numeru początkowego.