当前位置: 首页 > 知识库问答 >
问题:

Laravel迁移重命名可为空的字段解决方案?

鲁建茗
2023-03-14

mariadb 10.2中似乎有一个突破性的变化。7如果尝试重命名字段可为Null的datetime列,并且如果运行迁移,将出现错误:

[Illuminate\Database\QueryException]
  SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'due_date' (SQL: ALTER TABLE test
   CHANGE dueDate due_date DATETIME DEFAULT 'NULL')

创建迁移:

class CreateTestTable extends Migration
{
    public function up()
    {
        Schema::create('test', function (Blueprint $table) {
            $table->increments('id');
            $table->dateTime('dueDate')->nullable();
        });
    }
}

创建第二次迁移以重命名列:

class RenameColumn extends Migration
{
    public function up()
    {
        Schema::table('test', function(Blueprint $table) {
            $table->renameColumn('dueDate', 'due_date');
        });
    }
}

有没有一个解决办法来让这个工作?

根据条令/dbal问题:

为了允许表达式作为默认值,并将其与文字区分开来,Mariadb现在在信息模式中引用默认值。列表。这一变化在(Oracle-)Mysql/MariaDB平台之间带来了许多不兼容性。

本P/R中采用的解决方案不是为MariaDB创建特定的SchemaManager,而是映射当前MySQLSchemaManager中引入的更改(方法:getMariaDb1027ColumnDefault()。

来自MariaDB 10.2。7、信息架构变更包括:

NULL现在被引用为“NULL”(columdefault不可为NULL且未提供默认值时的异常:NULL保存在信息_架构中),编辑:查看异常https://jira.mariadb.org/browse/MDEV-14053字符串默认值被引用(要保存字符串“NULL”,请将默认值设置为“NULL”)。转义:在信息架构中,“.”被静默地更改为““””。除非在模型(模式差异)中手动用“'”转义默认值,否则这不会产生影响。另见第5点。默认文字值必须被引用,从而支持自动当前时间戳、当前日期、当前时间默认值被静默更改为“当前时间戳()”、“currdate()”、“currtime()”。为了防止模式差异,它们被映射回其原始值。

共有2个答案

宗啸
2023-03-14

虽然提供的解决方案工作,我更喜欢一个简单的方法:

public function up()
{
    Schema::table('test', function (Blueprint $table) {
        DB::statement('ALTER TABLE `test` CHANGE `dueDate` `due_date` TIMESTAMP NULL DEFAULT NULL;');
    });
}

public function down()
{
    Schema::table('test', function (Blueprint $table) {
        DB::statement('ALTER TABLE `test` CHANGE `dueDate` `due_date` TIMESTAMP NULL DEFAULT NULL;');
    });
}
黄跃
2023-03-14

您可以尝试以下方法:

创建新列并运行查询将值从旧列复制到新列

class RenameColumn extends Migration
{
    public function up()
    {
        Schema::table('test', function(Blueprint $table){
            $table->dateTime('due_date')->nullable();
        });

        // copy values from column 'dueDate' to 'due_date'
        // DB::update returns number of affected rows
        DB::update('UPDATE `test` SET due_date = dueDate');

        Schema::table('test', function(Blueprint $table){
            $table->dropColumn('dueDate');
        });
    }

    public function down()
    {
        Schema::table('test', function(Blueprint $table){
            $table->dateTime('dueDate')->nullable();
        });

        DB::update('UPDATE `test` SET dueDate = due_date');

        Schema::table('test', function(Blueprint $table){
            $table->dropColumn('due_date');
        });
    }
}
 类似资料:
  • 我用未签名的创建了一个迁移。如何在新迁移中编辑,使其也可以?

  • 问题内容: 我正在编写一个迁移,以立即在表中创建某些列。对于down函数,我当然想再次创建这些列。我浏览了架构生成器docs,但找不到实现此目的的方法。 任何帮助,将不胜感激。 问题答案: 在Laravel 5之前,还没有使用架构生成器来更改现有表列的Laravel本机方式。您需要为此使用原始查询。 但是,从Laravel 5开始,您可以使用:

  • 我正在编写一个迁移,以使表

  • 我有大约30个迁移文件。 当它到达包含重命名列的迁移时: 它只会在迁移时出错(比如说,第15个)。它可以正常运行所有其他迁移。如果我对此进行评论,那么它将按预期完成。 我运行或 我得到以下错误: PHP-v给了我这个: MySQL-v给了我这个: 我使用的是“条令/dbal”:“~2.3” 此错误仅在本地计算机上运行迁移时发生。在我的docker-compose堆栈和Vagant框中按预期完成。所

  • 问题内容: 我计划重命名现有Django项目中的多个模型,在该模型中,还有许多其他模型与我要重命名的模型具有外键关系。我相当确定这将需要多次迁移,但是我不确定确切的过程。 假设我从Django应用程序中的以下模型开始: 我想重命名该模型,因为该名称实际上没有任何意义,并且会导致代码混乱,并且会使名称更清晰。 根据我在Django开发文档中阅读的内容,我假设采用以下迁移策略: 第1步 修改 请注意,

  • 问题内容: 我的应用崩溃了,因为我没有正确处理迁移。 我正在寻找一种解决方案来迁移表中1列的名称。 在我的项目中,我有一个名为“ content ”的房间表,其 双人间 属性为“ archivedCount ”。在该应用程序的最新版本中,仍将属性 archivedCount 属性重命名为 dismissCount ,仍为 Double 类型 。 原始内容模型 新内容模型 尝试的解决方案 阅读了Go