索引长度 & MySQL / MariaDB
Laravel 默认使用 utf8mb4 字符集,支持在数据库中存储 emoji 表情。如果你现在运行的 MySQL 版本低于 5.7.7(或者低于 10.2.2 版本的 MariaDB),需要手动配置迁移命令生成的默认字符串长度,以便 MySQL 为它们创建索引。你可以通过在 AppServiceProvider 中调用 Schema::defaultStringLength 方法来完成配置:
use Illuminate\Support\Facades\Schema; /** * Bootstrap any application services. * * @return void * @translator laravelacademy.org */ public function boot() { Schema::defaultStringLength(191); }
作为可选方案,你可以为数据库启用 innodb_large_prefix 选项,至于如何合理启用这个选项,可以参考数据库文档说明。
重命名索引
要重命名一个索引,可以使用 renameIndex 方法,这个方法接收当前索引名作为第一个参数以及修改后的索引名作为第二个参数:
$table->renameIndex('from', 'to')
删除索引
要删除索引,必须指定索引名。默认情况下,Laravel 自动分配适当的名称给索引 —— 连接表名、列名和索引类型。下面是一些例子:
命令 | 描述 |
---|---|
$table->dropPrimary('users_id_primary'); | 从 “users” 表中删除主键索引 |
$table->dropUnique('users_email_unique'); | 从 “users” 表中删除唯一索引 |
$table->dropIndex('geo_state_index'); | 从 “geo” 表中删除普通索引 |
$table->dropSpatialIndex('geo_location_spatialindex'); | 从 “geo” 表中删除空间索引(不支持SQLite) |
如果要传递数据列数组到删除索引方法,那么相应的索引名称将会通过数据表名、列和键类型来自动生成:
Schema::table('geo', function (Blueprint $table) { $table->dropIndex(['state']); // Drops index 'geo_state_index' });
外键约束
Laravel 还提供了创建外键约束的支持,用于在数据库层面强制引用完整性。例如,我们在posts 表中定义了一个引用 users 表 id 列的 user_id 列:
Schema::table('posts', function (Blueprint $table) { $table->integer('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users'); });
你还可以为约束的“on delete”和“on update”属性指定期望的动作:
$table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade');
内容版权声明:除非注明,否则皆为本站原创文章。