【问题标题】:Laravel 5 | Migration Alter-Change Column took so longLaravel 5 | Migration Alter-Change Column 花了这么长时间
【发布时间】:2020-11-05 16:50:10
【问题描述】:

在我的用户表中有数百万条数据.....

我执行此迁移以更改列 my_data 的默认值...

Schema::table('users', function (Blueprint $table) {
    $table->string('my_data')->default(0)->change();
});

我在query_log.txt看到,php artisan migrate会执行这个查询

ALTER TABLE gn_users CHANGE my_data my_data VARCHAR(255) DEFAULT '0' NOT NULL

这很慢,将近1小时仍未完成迁移...

.

.

然后,我停止迁移,直接运行原始查询(我使用ALTER ... ALTER 而不是ALTER ... CHANGE

ALTER TABLE gn_users ALTER my_data SET DEFAULT '0'

而且这个查询只在几秒钟内完成......

.

.

所以,我的问题是,如何确保 Laravel 运行 ALTER ... ALTER 而不是 ALTER ... CHANGE

【问题讨论】:

    标签: laravel migration alter


    【解决方案1】:

    很可能出现缓慢是​​因为 Laravel 在 SQL 中使用的CHANGE 命令主要用于重命名列、更改数据类型。

    但是ALTER 列在这种情况下更有用,因为它更适合设置或更改默认值。

    (来源:https://hoelz.ro/ref/mysql-alter-table-alter-change-modify-column

    可能 Laravel 正在使用 change ,因为它最适合更改,可以普遍使用并且使用最广泛;通过文档搜索,不幸的是找不到强制使用ALTER 命令而不是CHANGE 的特定方法。

    为确保运行正确的命令并强制执行正确的命令,您始终可以使用 DB 外观的方法 - DB::statement("ALTER db ALTER col...") 执行原始查询

    最好始终仔细检查构建器将运行哪些命令,以及这些命令是否对案例有效且有效,因为它们无法始终预测最佳方式,您的案例就是一个很好的例子。

    【讨论】:

      猜你喜欢
      • 2013-07-18
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多