优化标点符号使用,删除多余空行

修改理由:
相关信息:
- 类型:文档文章
- 文章: 数据库迁移
- 文档: 《Laravel 8 中文文档(8.x)》
此投稿已在 4年前 合并。
内容修改:
Old | New | Differences |
---|---|---|
1 | ||
2 | 1 | # 数据库:迁移 |
3 | 2 | |
4 | 3 | - [介绍](#introduction) | … | … |
31 | 30 | <a name="generating-migrations"></a> |
32 | 31 | ## 生成迁移 |
33 | 32 | |
34 | 使用 `make:migration` [Artisan 命令](/docs/laravel/8.x/artisan) | |
33 | 使用 `make:migration` [Artisan 命令](/docs/laravel/8.x/artisan) 命令来创建迁移: | |
35 | 34 | |
36 | 35 | php artisan make:migration create_users_table |
37 | 36 | |
38 | ||
39 | 37 | 新的迁移文件将会放在 `database/migrations` 目录下。 所有的迁移文件名称都会包含一个时间戳,Laravel 将据此决定迁移文件运行的顺序。 |
40 | 38 | |
41 | > 提示:迁移 stubs 必须使用 [stub publishing](/docs/laravel/8.x/artisan#stub-customization) 进行自定义 | |
42 | ||
39 | > 提示:迁移 stubs 必须使用 [stub publishing](/docs/laravel/8.x/artisan#stub-customization) 进行自定义。 | |
43 | 40 | |
44 | 41 | `--table` 和 `--create` 选项也可用于确定表的名称以及是否在迁移中创建新的数据表。这些选项用指定的迁移模板预先填充指定的数据表: |
45 | 42 | … | … |
47 | 44 | |
48 | 45 | php artisan make:migration add_votes_to_users_table --table=users |
49 | 46 | |
50 | ||
51 | ||
52 | 这里提到的操作,是将会为生成的迁移文件指定自定义的输出路径, 您在执行`make:migration` 命令时,可以尝试使用`--path` 参数。 给定的路径是以应用程序文件夹为相对路径。 | |
47 | 这里提到的操作,是将会为生成的迁移文件指定自定义的输出路径, 您在执行 `make:migration` 命令时,可以尝试使用 `--path` 参数。 给定的路径是以应用程序文件夹为相对路径。 | |
53 | 48 | |
54 | 49 | <a name="squashing-migrations"></a> |
55 | 50 | ### 迁移转储(迁移合并) |
56 | 51 | |
57 | 随着时间, | |
58 | 示例 | |
52 | 随着时间,你构建的应用程序中的迁移会积累的越来越多。这会使目录变得臃肿,甚至会有数百个迁移文件。所以,如果你愿意,你可以将若干个迁移文件,压缩到单个SQL文件中。进行这个操作,需要执行的命令是:`schema:dump`。 | |
53 | 示例: | |
59 | 54 | |
60 | 55 | php artisan schema:dump |
61 | 56 | |
62 | // 上面示例为转储但不删除原有迁移文件,下面示例为转储且删除原有迁移文件 | |
57 | // 上面示例为转储但不删除原有迁移文件,下面示例为转储且删除原有迁移文件 | |
63 | 58 | php artisan schema:dump --prune |
64 | 59 | |
65 | 在执行以上命令后 | |
66 |
| |
67 | 在进行转储操作后,当您尝试进行迁移操作时,在未指定迁移文件的默认情况下,Laravel | |
60 | 在执行以上命令后,Lravel将会把转储后的SQL文件,放置到您项目的 `database/schema` 目录中。 | |
61 | ||
62 | 在进行转储操作后,当您尝试进行迁移操作时,在未指定迁移文件的默认情况下,Laravel 将会首先执行SQL文件的内容。在执行SQL文件后,Laravel 将会继续执行其他迁移文件。 | |
68 | 63 | |
69 | 64 | 数据库迁移的核心作用是,使团队中的其他开发人员,可以快速的创建该项目的初始数据库结构。 |
70 | 所以在完成项目的数据库架构修改后,您应该将数据库架构文件提交至代码管理员、项目负责人或是 | |
71 |
| |
72 | > 注意:迁移转储功能仅适用于 MySQL | |
65 | 所以在完成项目的数据库架构修改后,您应该将数据库架构文件提交至代码管理员、项目负责人或是 Git 类项目共享平台,这将大大提高您项目团队的效率和共协能力。 | |
66 | ||
67 | > 注意:迁移转储功能仅适用于 MySQL,PostgreSQL 和 SQLite 数据库。 | |
73 | 68 | |
74 | 69 | <a name="migration-structure"></a> |
75 | 70 | ## 迁移的操作方法 |
76 | 71 | |
77 | 72 | 面对的迁移的操作有两个方法: `up` 和 `down`。方法`up` 的作用是向数据库中添加新的表或列或索引,而 `down` 的方法,就是`up` 方法的反向操作。 |
78 | 73 | |
79 | ||
80 | ||
81 | 74 | 在这两种方法中,您可以使用 Laravel 的 `Schema` 生成器显式地创建和修改表。要了解 `Schema` 生成器上可用的所有方法,[请查看其文档](#creating-tables)。例如,以下迁移将创建一个 `flights` 表: |
82 | 75 | |
83 | 76 | <?php | … | … |
117 | 110 | <a name="running-migrations"></a> |
118 | 111 | ## 执行迁移 |
119 | 112 | |
120 | 执行以下 `migrate` Artisan 命令,来执行未执行过的迁移 | |
113 | 执行以下 `migrate` Artisan 命令,来执行未执行过的迁移: | |
121 | 114 | |
122 | 115 | php artisan migrate |
123 | 116 | … | … |
125 | 118 | |
126 | 119 | #### 在生产环境中强制执行迁移 |
127 | 120 | |
128 | 有些迁移操作是破坏性的,这意味着它们可能会导致数据丢失。为了防止您对生产数据库运行这些命令,在执行这些命令之前,系统将提示您进行确认。要在运行强制命令的时候去掉提示,请使用 `-force` | |
121 | 有些迁移操作是破坏性的,这意味着它们可能会导致数据丢失。为了防止您对生产数据库运行这些命令,在执行这些命令之前,系统将提示您进行确认。要在运行强制命令的时候去掉提示,请使用 `-force` 标志: | |
129 | 122 | |
130 | 123 | php artisan migrate --force |
131 | 124 | … | … |
140 | 133 | |
141 | 134 | php artisan migrate:rollback --step=5 |
142 | 135 | |
143 | ||
144 | ||
145 | 如果您在迁移后觉得有误,可以使用重置命令 `migrate:reset` ,回滚刚才进行的所有迁移操作,以恢复到上一次迁移状态。 | |
136 | 如果您在迁移后觉得有误,可以使用重置命令 `migrate:reset`,回滚刚才进行的所有迁移操作,以恢复到上一次迁移状态。 | |
146 | 137 | |
147 | 138 | 示例: |
148 | 139 | … | … |
150 | 141 | |
151 | 142 | #### 使用一个命令同时进行回滚和迁移操作 |
152 | 143 | |
153 | 使用 `migrate:refresh` | |
144 | 使用 `migrate:refresh` 命令将会回滚您的所有迁移操作,然后 Laravel 将自己继续执行 `migrate` 命令进行重新迁移。同时可在该命令后跟用 `--seed`,这个参数的作用是在“刷新”完成数据库之后,对后面新增的迁移文件进行迁移。 | |
154 | 145 | |
155 | 146 | 示例: |
156 | 147 | php artisan migrate:refresh |
157 | 148 | |
158 | // 上列是刷新当前已有的迁移,下列是刷新当前已有的迁移后,更新未有的迁移 | |
149 | // 上列是刷新当前已有的迁移,下列是刷新当前已有的迁移后,更新未有的迁移 | |
159 | 150 | php artisan migrate:refresh --seed |
160 | 151 | |
161 | 152 | 在`migrate:refresh`中,您还可以使用 `step` 参数来一次性选择回滚的次数。例如,以下命令将回滚并重新迁移最后五次迁移: | … | … |
177 | 168 | <a name="creating-tables"></a> |
178 | 169 | ### 创建数据表 |
179 | 170 | |
180 | 接下来我们将使用`Schema` 的 `create`方法,创建一个新的数据表。 `create` 方法中可以接受两个参数,一个是表格的名称,第二个是 `Closure` | |
171 | 接下来我们将使用`Schema` 的 `create`方法,创建一个新的数据表。 `create` 方法中可以接受两个参数,一个是表格的名称,第二个是 `Closure`,作用是可以在定义一个新数据表的时候接受 `Blueprint` 对象。 | |
181 | 172 | 示例: |
173 | ||
182 | 174 | Schema::create('users', function (Blueprint $table) { |
183 | 175 | $table->id(); |
184 | 176 | }); | … | … |
187 | 179 | |
188 | 180 | #### 检查表/列是否存在 |
189 | 181 | |
190 | 您可以使用 `hasTable` 和 `hasColumn` 方法来检测表/列是否存在 | |
182 | 您可以使用 `hasTable` 和 `hasColumn` 方法来检测表/列是否存在: | |
191 | 183 | |
192 | 184 | if (Schema::hasTable('users')) { #如果不存在'users'表则执行 |
193 | 185 | // | … | … |
199 | 191 | |
200 | 192 | #### 数据库连接 & 数据表选项 |
201 | 193 | |
202 | ||
203 | ||
204 | 194 | 如果要对非默认连接的数据库连接执行结构操作,可以使用 `connection` 方法: |
205 | 195 | |
206 | 196 | Schema::connection('foo')->create('users', function (Blueprint $table) { | … | … |
245 | 235 | $table->string('email'); |
246 | 236 | }); |
247 | 237 | |
248 | ||
249 | ||
250 | 238 | #### 可用的字段类型 |
251 | 239 | |
252 | 240 | 数据库结构生成器包含构建表时可以指定的各种字段类型: | … | … |
315 | 303 | `$table->uuid('id');` | 相当于 UUID |
316 | 304 | `$table->year('birth_year');` | 相当于 YEAR |
317 | 305 | |
318 | ||
319 | ||
320 | 306 | <a name="column-modifiers"></a> |
321 | 307 | ### 字段修饰 |
322 | 308 | |
323 | 除了上述列出的字段类型之外,还有几个可以在添加字段到数据库表时使用的 | |
309 | 除了上述列出的字段类型之外,还有几个可以在添加字段到数据库表时使用的「修饰符」。例如,如果要把字段设置为「可空」,你可以使用 `nullable` 方法: | |
324 | 310 | |
325 | 311 | Schema::table('users', function (Blueprint $table) { |
326 | 312 | $table->string('email')->nullable(); | … | … |
376 | 362 | |
377 | 363 | > 注意:支持哪些默认值的表示方式取决于你的数据库驱动、数据库版本、还有字段类型。请参考合适的文档使用。还有一点要注意的是,使用数据库特定函数,可能会将你绑牢到特定的数据库驱动上。 |
378 | 364 | |
379 | ||
380 | ||
381 | 365 | <a name="modifying-columns"></a> |
382 | 366 | ### 修饰字段 |
383 | 367 | … | … |
423 | 407 | $table->dropColumn('votes'); |
424 | 408 | }); |
425 | 409 | |
426 | ||
427 | ||
428 | 410 | 你可以传递一个字段数组给 `dropColumn` 方法来删除多个字段: |
429 | 411 | |
430 | 412 | Schema::table('users', function (Blueprint $table) { |
431 | 413 | $table->dropColumn(['votes', 'avatar', 'location']); |
432 | 414 | }); |
433 | 415 | |
434 | > 注意:使用 SQLite 数据库时不支持在单个迁移中 | |
416 | > 注意:使用 SQLite 数据库时不支持在单个迁移中 **删除** 或 **修改** 多个字段。 | |
435 | 417 | |
436 | 418 | #### 可用的命令别名 |
437 | 419 | … | … |
478 | 460 | `$table->index('state');` | 添加普通索引 |
479 | 461 | `$table->spatialIndex('location');` | 添加空间索引(不支持 SQLite) |
480 | 462 | |
481 | ||
482 | ||
483 | 463 | #### 关于 MySQL 和 MariaDB 的索引长度 |
484 | 464 | |
485 | 465 | Laravel 默认使用 utf8mb4 编码,它支持在数据库中储存 emojis 。如果你是在版本低于 5.7.7 的 MySQL 或者版本低于 10.2.2 的 MariaDB 上创建索引,那你就需要手动配置数据库迁移的默认字符串长度。即在 `AppServiceProvider` 中调用 `Schema::defaultStringLength` 方法来配置它: |
486 | 466 | |
487 | 467 | use Illuminate\Support\Facades\Schema; |
488 | 468 | |
489 | ||
490 | ||
491 | ||
492 | ||
493 | ||
494 | ||
495 | ||
496 | ||
497 | ||
469 | /** | |
470 | * Bootstrap any application services. | |
471 | * | |
472 | * @return void | |
473 | */ | |
474 | public function boot() | |
475 | { | |
476 | Schema::defaultStringLength(191); | |
477 | } | |
498 | 478 | |
499 | 479 | 当然,你也可以选择开启数据库的 `innodb_large_prefix` 选项。至于如何正确开启,请自行查阅数据库文档。 |
500 | 480 | |
501 | 481 | <a name="renaming-indexes"></a> |
502 | 482 | ### 重命名索引 |
503 | 483 | |
504 | 若要重命名索引,你需要调用 `renameIndex` 方法。此方法接受当前索引名称作为其第一个参数,并将所需名称作为其第二个参数 | |
484 | 若要重命名索引,你需要调用 `renameIndex` 方法。此方法接受当前索引名称作为其第一个参数,并将所需名称作为其第二个参数: | |
505 | 485 | |
506 | 486 | $table->renameIndex('from', 'to') |
507 | 487 | … | … |
517 | 497 | `$table->dropIndex('geo_state_index');` | 从 「geo」 表中删除基本索引 |
518 | 498 | `$table->dropSpatialIndex('geo_location_spatialindex');` | 从 「geo」 表中删除空间索引(不支持 SQLite) |
519 | 499 | |
520 | ||
521 | ||
522 | 500 | 如果将字段数组传给 `dropIndex` 方法,会删除根据表名、字段和键类型生成的索引名称。 |
523 | 501 | |
524 | 502 | Schema::table('geo', function (Blueprint $table) { | … | … |
548 | 526 | $table->foreignId('user_id')->constrained('users'); |
549 | 527 | }); |
550 | 528 | |
551 | ||
552 | 你可以为约束的 「on delete」 和 「on update」 属性指定所需的操作: | |
529 | 你可以为约束的「on delete」和「on update」属性指定所需的操作: | |
553 | 530 | |
554 | 531 | $table->foreignId('user_id') |
555 | 532 | ->constrained() | … | … |
561 | 538 | ->nullable() |
562 | 539 | ->constrained(); |
563 | 540 | |
541 | 要删除一个外键,你需要使用 `dropForeign` 方法,将要删除的外键约束作为参数传递。外键约束采用的命名方式与索引相同。即,将数据表名称和约束的字段连接起来,再加上 `_foreign` 后缀: | |
542 | ||
543 | $table->dropForeign('posts_user_id_foreign'); | |
544 | ||
545 | 或者,可以给 `dropForeign` 方法传递一个数组,该数组包含要删除的外键的列名。数组将根据 Laravel 的 Schema 生成器使用的约束名称约定自动转换: | |
546 | ||
547 | $table->dropForeign(['user_id']); | |
548 | ||
549 | 你可以在迁移文件中使用以下方法来开启或关闭外键约束: | |
550 | ||
551 | Schema::enableForeignKeyConstraints(); | |
552 | ||
553 | Schema::disableForeignKeyConstraints(); | |
554 | ||
555 | > 注意:SQLite 默认禁用外键约束。使用 SQLite 时,请确保在数据库配置中启用 [启用外键支持](https://learnku.com/docs/laravel/8.x/configuration/9355) 然后再尝试在迁移中创建它们。另外, SQLite只在创建表时支持外键,并且 [在修改表时就不会了](https://www.sqlite.org/omitted.html)。 | |
556 | ||
564 | 557 | |
565 | ||
566 | ||
567 | ||
568 | ||
569 | ||
570 | ||
571 | ||
572 | ||
573 | ||
574 | ||
575 | ||
576 | ||
577 | ||
578 | ||
579 | ||
580 | ||
581 | ||
582 |