Когда я пытаюсь использовать PHP Laravels Migration and schema builder, я продолжаю получать ошибку ниже на любом табуле, у которого есть столбец с индексом автоматического увеличения и обычный столбец user_id integer.
Приведенная ниже ошибка показывает, что в столбце user_id SQL генерируется значение auto_increment на user_id, и мой код не говорит, что он это делает!
Я использую Laravel v5.3
Мой код схемы:
public function up() { Schema::create('bookmark_tag_lists', function(Blueprint $table) { $table->increments('id', 10); $table->string('title', 100)->nullable(); $table->string('slug', 100)->nullable(); $table->text('description', 65535)->nullable(); $table->string('list_icon', 200)->nullable(); $table->text('tags', 65535)->nullable(); $table->integer('user_id', 10)->unsigned(); $table->dateTime('created_on'); $table->dateTime('modified_on'); $table->integer('parent')->default(0); $table->string('breadcrumb_path')->nullable(); $table->integer('tag_count')->default(0); $table->integer('bookmark_count')->default(0); $table->integer('sort')->default(0); $table->integer('active')->default(1); }); }
ошибка базы данных
[Illuminate\Database\QueryException] SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table def inition; there can be only one auto column and it must be defined as a key (SQL: create table `bookmark_tag_lists` (`id` int unsigned not null auto_in crement primary key, `title` varchar(100) null, `slug` varchar(100) null, ` description` text null, `list_icon` varchar(200) null, `tags` text null, `u ser_id` int unsigned not null auto_increment primary key, `created_on` date time not null, `modified_on` datetime not null, `parent` int not null defau lt '0', `breadcrumb_path` varchar(255) null, `tag_count` int not null defau lt '0', `bookmark_count` int not null default '0', `sort` int not null defa ult '0', `active` int not null default '1') default character set utf8 coll ate utf8_unicode_ci) [Doctrine\DBAL\Driver\PDOException] SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table def inition; there can be only one auto column and it must be defined as a key
Привет, возможно, это решение. Давайте рассмотрим эту строку, которая определяет значение user_id.
$table->integer('user_id', 10)->unsigned();
Я думаю, вы имели в виду, что вам нужно 10-байтовое целое без знака, записывающее это, но есть одна вещь о типе целочисленного поля в Laravel 5.3. Давайте рассмотрим это определение метода, оно ожидает до трех параметров, которые будут переданы в:
public function Blueprint::integer($column, $autoIncrement = false, $unsigned = false) Illuminate\Support\Fluent Create a new integer (4-byte) column on the table. Parameters: string $column bool $autoIncrement bool $unsigned
Таким образом, переходя в 10 php, он переводит его в логическое, и это делает его истинным, поэтому в нем говорится, что вы пытаетесь создать несколько полей автоинкремента!
Окончательно решение:
$table->integer('user_id', false,true);
с этим вы просите создать не поле автоинкремента, но все равно без знака, как вы пожелаете. Но он создает 4 байта беззнакового целого с ним так. Существует еще лучшее решение:
$table->bigInteger('user_id',false,true);
Это создает 8 баз данных без знака NOT autoInrement в базе данных.
Надеюсь, это поможет.
Я исправил добавление $table->index('user_id');
к моему строителю схемы таблиц tag_list