laravel 迁移在不是主要的时候使用自动增量
Posted
技术标签:
【中文标题】laravel 迁移在不是主要的时候使用自动增量【英文标题】:laravel migration use auto increment when its not primary 【发布时间】:2017-10-14 19:57:37 【问题描述】:我正在尝试使用 Laravel 迁移创建一个表,但我遇到了一些麻烦。我只需要创建一个带有主对('user_id' 和'media_id')的表,'inc' 是一个自动增量。我可以在 mysql 中做到这一点,但我无法用 Laravel 迁移做到这一点,因为 increments() 也将该字段设置为主要字段。我得到的错误
SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key
到目前为止,我已经做到了
public function up()
Schema::create('tagtables', function (Blueprint $table)
$table->integer('media_id');
$table->integer('user_id');
$table->boolean('approved')->default(false);
$table->increments('inc')->unsigned();
$table->timestamps();
$table->dropPrimary('tagtables_inc_primary');
$table->primary(array('user_id','media_id'));
// $table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
// $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
);
// Schema::table('tagtables', function (Blueprint $table)
// //$table->increments('id');
// $table->primary(array('user_id','media_id'));
// $table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
// $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
// );
【问题讨论】:
你不需要将它们设为主键,而它们是外键 【参考方案1】:我认为你需要这个:
public function up()
Schema::create('tagtables', function (Blueprint $table)
$table->increments('inc');
$table->integer('media_id')->unsigned();
$table->integer('user_id')->unsigned();
$table->boolean('approved')->default(false);
$table->timestamps();
$table->index(['user_id', 'media_id']);
$table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
);
并将其放入模型中:
protected $primaryKey = 'inc';
【讨论】:
我收到另一个错误 [Illuminate\Database\QueryException] SQLSTATE[42000]:语法错误或访问冲突:1068 定义了多个主键(SQL:alter tabletagtables
add primary key tagtables_user_id_media_id_primary
( user_id
, media_id
))
对不起,我只是从您的帖子中复制其余代码。将$table->primary(['user_id', 'media_id']);
更改为$table->index(['user_id', 'media_id']);
【参考方案2】:
我找到了问题的解决方案,即在创建架构后定义该列 inc(自动递增)。
应该是这样的
public function up()
Schema::create('tagtables', function (Blueprint $table)
$table->integer('media_id');
$table->integer('user_id');
$table->boolean('approved')->default(false);
// $table->increments('inc');
$table->timestamps();
// $table->dropPrimary( 'tagtables_inc_primary' );
$table->primary(array('user_id','media_id'));
// $table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
// $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
);
DB::statement('ALTER Table tagtables add id INTEGER NOT NULL UNIQUE AUTO_INCREMENT;');
// Schema::table('tagtables', function (Blueprint $table)
// //$table->increments('id');
// $table->primary(array('user_id','media_id'));
// $table->foreign('media_id')->references('id')->on('media')->onUpdate('cascade')->onDelete('cascade');
// $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
// );
化学
【讨论】:
以上是关于laravel 迁移在不是主要的时候使用自动增量的主要内容,如果未能解决你的问题,请参考以下文章
Doctorine/Dbal - 更新表迁移在整数上添加不需要的“自动增量”(不是增量)
在迁移 laravel 5.1 中设置自动增量字段从 1000 开始