gpt4 book ai didi

laravel - 如何迁移更改列类型?

转载 作者:行者123 更新时间:2023-12-05 00:52:28 25 4
gpt4 key购买 nike

我遇到错误,当我尝试将列类型从字符串转换为文本时,使用 Laravel 的迁移功能。

文件:{data_time}_change_db_structure.php

public function up()
{
Schema::table('service_request_type', function (Blueprint $table) {
$table->dropIndex(['sro_key_group']);

$table->text('sro_key_group')->change();
$table->renameColumn('sro_key_group', 'tags');
});
}

这是原始迁移创建表文件。
public function up()
{
Schema::create('service_request_type', function (Blueprint $table) {
$table->engine = 'InnoDB';
...
$table->string('sro_key_group', 100)->nullable()->index();
...
});
}

我得到的错误。

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'sro_key_group' used in key specification without a key length (SQL: ALTER TABLE service_request_type CHANGE sro_key_group sro _key_group TEXT DEFAULT NULL COLLATE utf8_unicode_ci)

                                                                                                                                          [Doctrine\DBAL\Driver\PDOException]                                   

SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'sro_key_group' used in key specification without a key length

                                                                                                                                          [PDOException]                                                        

SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'sro_key_group' used in key specification without a key length



什么错?我已经安装了 doctrine/dbal在我的 composer.json .

最佳答案

您需要分三步执行此操作,或者使用三个单独的迁移,或者三个调用 table()。正如您在回答中所示。

第一个问题是,即使您已经按照您希望它们执行的顺序(以及它们需要执行的顺序)编写了语句,模式构建器实际上会重新排列顺序,以便执行“更改”语句第一的。模式构建器将新列和更改的列视为“隐含”语句,并将它们移到要运行的命令堆栈的顶部。但是,重命名语句不被视为“更改”语句。

因此,即使您已将代码编写为:

[
remove index,
change column from varchar to text,
rename column,
]

模式构建器将实际执行:
[
change column from varchar to text,
remove index,
rename column,
]

现在,由于更改命令是在从索引中删除列之前发生的,因此您会收到 1170 错误。

下一个问题是尝试在同一上下文中进行列更改和列重命名。实现请求更改的 SQL 是通过执行架构差异生成的,但是两个架构差异都将在实际进行任何更改之前完成。所以,第一个变化来自 varchartext将生成适当的 SQL 以进行更改,但是第二次重命名列的更改实际上会生成 SQL,在重命名列时将其更改回文本字段。

要解决这些问题,您可以创建三个迁移,其中第一个迁移简单地删除索引,第二个迁移更改类型,然后第三个迁移重命名它,或者您可以保留一个迁移并运行三个 table()声明。
public function up()
{
// make sure the index is dropped first
Schema::table('service_request_type', function (Blueprint $table) {
$table->dropIndex(['sro_key_group']);
});

// now change the type of the field
Schema::table('service_request_type', function (Blueprint $table) {
$table->text('sro_key_group')->nullable()->change();
});

// now rename the field
Schema::table('service_request_type', function (Blueprint $table) {
$table->renameColumn('sro_key_group', 'tags');
});
}

关于laravel - 如何迁移更改列类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42663090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com