当我尝试使用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
4条答案
按热度按时间szqfcxe21#
嗨,这里可能有一个解决方案。让我们看看这行定义user_id值。
我想你的意思是你需要10字节的无符号整数来写这个,但是在Laravel 5.3中有一件关于整数字段类型的事情。让我们看看这个方法定义,它期望最多传入3个参数:
因此,通过传入10个php将其转换为布尔值并使其为真,这就是为什么它说您正在尝试创建多个自动增量字段!
最终的解决方案是:
这样你就要求创建一个非自动递增的字段,但是仍然是无符号的。2但是它创建了一个4字节的无符号整数。3还有更好的解决方法:
这个函数在数据库中创建8字节无符号NOT自动增量字段。
希望能有所帮助。
hfyxw5xn2#
在你的代码中,你试图给整数给予大小,这导致了这个错误。如果你改变下面的代码,你将不会得到同样的错误。
将此行
$table->integer('user_id', 10)->unsigned();
更改为$table->integer('user_id');
希望这能有所帮助
pdkcd3nj3#
我通过将
$table->index('user_id');
添加到tag_list表模式构建器中进行了修复vltsax254#
如果你的错误是把数字10放在整数('name',10)里面,按照laravel文档(https://laravel.com/docs/10.x/migrations#column-method-integer),你会发现你不需要它。
要修复,只需删除值10
这个
至
还有两条评论
1 - UNSIGNED是MySQL中整数的一个可选属性,用于定义正数,请检查使用它是否有意义。
2 -如果您要在整数中的列名后放置任何非0的值,它将认为它是auto_increment的“true”值,这就是出现此错误的原因