首先看一下主键的一些写法
// 生成字段
$table->integer('id'); // 增加类型为INT,长度为10的id字段
$table->bigInteger('id'); // 增加类型为BIGINT,长度为20的id字段
$table->id(); // 增加类型为BIGINT,长度为20,自增,主键为id的字段
$table->increments('id'); // 增加类型为INT,长度为10,自增,主键为id字段
$table->bigIncrements('id'); // 增加类型为BIGINT,长度为20,自增,主键为id字段
// 设置类型为INT的主键
$table->integer('id')->primary(); // 增加类型为INT,长度为11,(无自增属性)主键为id字段
$table->integer('id')->autoIncrement(); // 增加类型为INT,长度为11,自增,主键为id字段
$table->integer('id')->primary()->autoIncrement(); // 无法执行,autoIncrement()自动将基添加为自增加主键
// 设置类型为BIGINT的主键
$table->bigInteger('id')->primary(); // 增加类型为BIGINT,长度为20,(无自增属性)主键为id字段
$table->bigInteger('id')->autoIncrement(); // 增加类型为BIGINT,长度为20,自增,主键为id字段
$table->bigInteger('id')->primary()->autoIncrement();// 无法执行,autoIncrement()自动将基添加为自增加主键
索引排序algorithm的设置方法:
(错误写法)同一个数据迁移表里无法执行两条设置同一字段为主键的写法。
// 错误写法
$table->increments('id');
$table->primary('id','id','BTREE'); // algorithm 使用BTREE
正确写法(但此写法并未实现id自增的设置):
$table->integer('id');
$table->primary('id','id','BTREE'); // algorithm 使用BTREE
需求分析
需求:
生成id字段,要求id为自增,主键,且索引排序为:algorithm
分析:
根据反复试验,无法同时设置这么多项。
根据上面的分析,要想实现这个需求,必须要先生成表,然后再更改表。
laravel框架默认不带更改数据库字段的包,因此需要另外安装一个doctrine/dbal。
实现:
更改字段需要安装,如果未安装,更改表字段会提示:
Changing columns for table "my_tables" requires Doctrine DBAL. Please install the doctrine/dbal package.
1、安装 doctrine/dbal
composer require doctrine/dbal=^2.*
提示:直接安装最新版本的doctrine/dbal 会提示如下错误(可能是兼容性问题,或者需要另外配置)切换回2.*版本的即解决问题
Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
2、代码实现
public function up()
{
// 创建表
Schema::create('my_tables', function (Blueprint $table) {
$table->integer('id');
$table->primary('id', 'id', 'BTREE');
});
// 更改表,添加自增加属性
Schema::table('my_tables', function (Blueprint $table) {
$table->integer('id')->autoIncrement()->change();
});
}
提示:如果先添加自增主键,laravel数据迁移无法再通过在数据迁移中实现将索引排序algorithm设置为BTREE