当我尝试使用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
答案 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表架构构建器