Laravel Scheme Builder将auto_increment添加到所有整数字段,使其失败

时间:2016-12-10 17:04:48

标签: php mysql laravel laravel-5.3

当我尝试使用PHP Laravels数据库迁移和模式构建器时,我在任何具有自动递增ID列和常规user_id整数列的选项卡上都会收到以下错误。

下面的错误显示正在使用user_id上的值 auto_increment 生成user_id列SQL,而我的代码并没有告诉它在任何地方都这样做!

我使用的是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

3 个答案:

答案 0 :(得分:3)

嗨,这可能是一个解决方案。让我们看一下定义user_id值的这一行。

$table->integer('user_id', 10)->unsigned();

我认为你的意思是你需要写10字节无符号整数,但Laravel 5.3中有一个关于整数字段类型的东西。 让我们看一下这个方法定义,它最多可以传入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);

有了这个,你要求创建非自动增量字段,但仍然无符号。但它创建了4byte无符号整数。 还有更好的解决方案:

   $table->bigInteger('user_id',false,true);

这个在数据库中创建8byte unsigned NOT autoincrement字段。

希望它会有所帮助。

答案 1 :(得分:1)

在你的代码中,你试图给出整数的大小,这会导致错误。如果您更改以下代码,则无法获得相同的错误。

将此行$table->integer('user_id', 10)->unsigned();更改为$table->integer('user_id');

希望这会有所帮助

答案 2 :(得分:0)

我通过将$table->index('user_id');添加到我的tag_list表架构构建器

来修复