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

dojqjjoe  于 2023-03-16  发布在  PHP
关注(0)|答案(4)|浏览(85)

当我尝试使用PHP Laravels数据库迁移和模式构建器时,我一直在任何具有自动递增ID列和常规user_id整数列的表上得到下面的错误。
下面的错误显示了user_id列SQL是用user_id上的值auto_increment生成的,而我的代码并没有告诉它在任何地方这样做!
我正在使用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
szqfcxe2

szqfcxe21#

嗨,这里可能有一个解决方案。让我们看看这行定义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);

这样你就要求创建一个非自动递增的字段,但是仍然是无符号的。2但是它创建了一个4字节的无符号整数。3还有更好的解决方法:

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

这个函数在数据库中创建8字节无符号NOT自动增量字段。
希望能有所帮助。

hfyxw5xn

hfyxw5xn2#

在你的代码中,你试图给整数给予大小,这导致了这个错误。如果你改变下面的代码,你将不会得到同样的错误。
将此行$table->integer('user_id', 10)->unsigned();更改为$table->integer('user_id');
希望这能有所帮助

pdkcd3nj

pdkcd3nj3#

我通过将$table->index('user_id');添加到tag_list表模式构建器中进行了修复

vltsax25

vltsax254#

如果你的错误是把数字10放在整数('name',10)里面,按照laravel文档(https://laravel.com/docs/10.x/migrations#column-method-integer),你会发现你不需要它。
要修复,只需删除值10
这个

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

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

还有两条评论
1 - UNSIGNED是MySQL中整数的一个可选属性,用于定义正数,请检查使用它是否有意义。
2 -如果您要在整数中的列名后放置任何非0的值,它将认为它是auto_increment的“true”值,这就是出现此错误的原因

相关问题