(3) 索引操作

最后更新于:2022-04-02 01:42:26

[TOC] ## 索引创建 ### 创建唯一索引 1. 在字段定义后,链式调用 `unique` 方法来创建索引: ~~~php $table->string('email')->unique(); ~~~ 2. 也可以在定义完所有字段之后,单独创建索引: ~~~php $table->unique('email'); ~~~ ### 创建复合索引 传递一个包含字段名的数组至索引方法: ~~~php $table->index(['account_id', 'created_at']); ~~~ ### 自定义索引名称 Laravel 会自动生成一个合理的索引名称,但也可以使用第二个参数来自定义: ~~~php $table->index('email', 'my_index_name'); ~~~ ### 可用的索引类型 命令 | 描述 ------------- | ------------- `$table->primary('id');` | 添加主键。 `$table->primary(['first', 'last']);` | 添加复合键。 `$table->unique('email');` | 添加唯一索引。 `$table->unique('state', 'my_index_name');` | 自定义索引名称。 `$table->unique(['first', 'last']);` | 添加复合唯一键。 `$table->index('state');` | 添加基本索引。 ### 配置索引长度 Laravel 默认使用 `utf8mb4` 字符,可支持在数据库里存储「表情」。 如果你使用的 **MySQL 版本低于 5.7.7** 或 **MariaDB 版本低于 10.2.2**,你可能需要手动配置默认字符串长度,以顺利创建索引。 方法是修改 `app/Providers/AppServiceProvider.php` 文件,调用 `Schema::defaultStringLength` 方法: ~~~php use Illuminate\Support\Facades\Schema; /** * Bootstrap any application services. * 引导任何应用程序服务。 * * @return void */ public function boot() { Schema::defaultStringLength(191); } ~~~ 或者你可以为数据库开启 `innodb_large_prefix` 选项,有关如何正确开启此选项的说明请查阅数据库文档。 ## 索引移除 >[danger] 若要移除索引,则**必须**指定索引的名称。 ### 传递完整的索引名称字符串 >[info] Laravel 默认会自动给索引分配合理的名称:数据表名称_索引的字段名称_索引类型。 命令 | 描述 ------------- | ------------- `$table->dropPrimary('users_id_primary');` | 从「users」数据表移除主键。 `$table->dropUnique('users_email_unique');` | 从「users」数据表移除唯一索引。 `$table->dropIndex('geo_state_index');` | 从「geo」数据表移除基本索引。 ### 传递包含字段名的数组 >[info] 索引名称将由 数据表名 和 字段名 拼接而成 ~~~php Schema::table('geo', function (Blueprint $table) { $table->dropIndex(['state']); // 移除索引 'geo_state_index' }); ~~~ ## 外键约束 ### 创建外键约束 有 `user_id` 字段的 `posts` 数据表,`user_id` 引用了 `users` 数据表的 `id` 字段: ~~~php Schema::table('posts', function (Blueprint $table) { $table->integer('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users'); }); ~~~ ### 指定外键约束的「on delete」及「on update」行为 ~~~php $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade'); ~~~ ### 移除外键约束: `dropForeign` 方法 #### 传递完整的外键约束名称字符串 >[info] 外键约束与索引采用相同的命名方式:数据表名称_约束字段_foreign。 ~~~php $table->dropForeign('posts_user_id_foreign'); ~~~ #### 传递一个包含字段名的数组 ~~~php $table->dropForeign(['user_id']); ~~~ > 在移除的时候,字段会按照惯例被自动转换为对应的外键名称。 #### 在迁移文件里开启和关闭外键约束 ~~~php // 开启 Schema::enableForeignKeyConstraints(); // 关闭 Schema::disableForeignKeyConstraints(); ~~~
';