Привет, У меня возникла проблема с созданием таблицы с помощью построителя схем миграции. Проблема связана с таблицей с внутренним ключом внешней ссылки. Вот код, вызывающий ошибку:
Schema::create('cb_category', function($table) { $table->integer('id')->primary()->unique()->unsigned(); $table->integer('domain_id')->unsigned(); $table->foreign('domain_id')->references('id')->on('cb_domain'); $table->integer('parent_id')->nullable(); $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade'); $table->string('name'); $table->integer('level'); });
Вот ошибка:
SQLSTATE[HY000]: General error: 1005 Can't create table 'eklik2.#sql-7d4_e' (errno: 150) (SQL: alter table `cb_cate
gory add constraint cb_category_parent_id_foreign foreign key (
parent_id ) references
cb_category (
id`) на каскаде del ete при каскаде обновления) (Bindings: array ())
[PDOException] SQLSTATE [HY000]: Общая ошибка: 1005 Невозможно создать таблицу 'eklik2. # Sql-7d4_e' (errno: 150)
Есть идеи?
Вы должны разбить это на два блока схемы, один из которых создает столбцы, а другой – FK. mysql не может работать одновременно.
Возможно, я опоздал на вечеринку, но официальные документы утверждают, что внешний ключ в случае целых чисел должен быть ->unsigned();
http://laravel.com/docs/4.2/schema#foreign-keys
Примечание. При создании внешнего ключа, который ссылается на добавочное целое число, не забудьте всегда сделать столбец внешнего ключа неподписанным.
Кроме того, Artisan не терпит неудачу, если вы (как я) misspell unsigned()
и я потратил немало часов, пытаясь понять, почему ключ не был создан.
Итак, две вещи: 1. Всегда делайте столбец внешнего ключа неподписанным в случае увеличения целых чисел. 2. Проверьте орфографию unsigned()
Schema::create('cb_category', function (Blueprint $table) { $table->increments('id')->unsigned(); $table->integer('domain_id')->unsigned(); $table->foreign('domain_id')->references('id')->on('cb_domain'); $table->integer('parent_id')->nullable(); $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade'); $table->string('name'); $table->integer('level'); });
Попробуй это