Postgres 和 Laravel 如何将列从字符串类型更改为整数?

Posted

技术标签:

【中文标题】Postgres 和 Laravel 如何将列从字符串类型更改为整数?【英文标题】:Postgres and Laravel how to change column from type string to integer? 【发布时间】:2020-11-10 07:43:37 【问题描述】:

我试图在 Postgres 和 Laravel 6.x 上将一列从字符串类型更改为整数。我试图通过这样的迁移来做到这一点:

    public function up()
    
        Schema::table('job_listings', function (Blueprint $table) 
            $table->integer('company_id')->change();
        );
    

当我运行此迁移时,我收到一个错误,该列无法自动转换为整数:

In Connection.php line 664:

  SQLSTATE[42804]: Datatype mismatch: 7 ERROR:  column "company_id" cannot be cast automatically to type integer
  HINT:  You might need to specify "USING company_id::integer". (SQL: ALTER TABLE job_listings ALTER company_id TYPE INT)


In PDOStatement.php line 123:

  SQLSTATE[42804]: Datatype mismatch: 7 ERROR:  column "company_id" cannot be cast automatically to type integer
  HINT:  You might need to specify "USING company_id::integer".


In PDOStatement.php line 121:

  SQLSTATE[42804]: Datatype mismatch: 7 ERROR:  column "company_id" cannot be cast automatically to type integer
  HINT:  You might need to specify "USING company_id::integer".

PostgreSQL 中如何指定 USING 将该列从字符串类型更改为整数?

【问题讨论】:

【参考方案1】:

您必须指定显式转换,因为没有从文本或 varchar 到整数的隐式(自动)转换。我不知道有一个 Laravel 函数来指定强制转换,所以我建议你使用原始 DB 语句来实现这一点。

你可以这样做:

public function up()

    DB::statement('ALTER TABLE job_listings ALTER COLUMN 
                  company_id TYPE integer USING (company_id)::integer');

在某些情况下,您的文本或 varchar 字段中可能存在空格,因此您必须在转换之前进行修剪

public function up()

    DB::statement('ALTER TABLE job_listings ALTER COLUMN 
                  company_id TYPE integer USING (trim(company_id))::integer');

【讨论】:

谢谢!你会为down 方法添加什么? $table->string('company_id')->change(); 应该可以正常使用 Schema SQL 字符串末尾都缺少右括号 - SQL 中的括号当前不匹配。 修复了这个问题。谢谢@Mog0【参考方案2】:

即使表格是否有行,它仍然会返回该错误。因此,如果您不想要原始查询并且您的列没有价值或有但不重要,只需删除列并创建新列:

public function up()

    Schema::table('job_listings', function (Blueprint $table) 
        $table->dropColumn('company_id');
        $table->integer('company_id');
    );

【讨论】:

以上是关于Postgres 和 Laravel 如何将列从字符串类型更改为整数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列从一个 CSV 文件复制到另一个 CSV 文件?

当索引依赖于该列而不重新创建索引时,如何将列从 null 更改为非 null?

将列从一个 datagridview 和结果添加到另一个 datagridview

将列从 DGV 添加到 SQL 服务器的问题

将列从 varchar 更改为 int

将列从日期转换为日期时间