【问题标题】:MySql Error: 1364 Field 'display_name' doesn't have default valueMySql 错误:1364 字段 'display_name' 没有默认值
【发布时间】:2013-09-16 01:46:32
【问题描述】:

我刚刚从 MAMP 安装切换到本地 Apache、MySql 和 PHP 安装。我一切正常,但我已经开始在新环境中使用我的网络应用程序,突然任何 INSERT 命令都会导致以下错误:

SQLSTATE[HY000]:一般错误:1364 字段“display_name”没有默认值

似乎我现在无法在以前可以的情况下将字段留空。我正在使用 MySql 版本 5.6.13

有没有办法在 MySql 中更改此设置?

【问题讨论】:

  • display_name 是不是具有 NOT NULL 约束且没有默认值的字段?您的插入语句是否没有为 display_name 提供值?了解您的表结构和插入语句会很有帮助。
  • 去掉严格设置或将默认值设置为NULL
  • 我遇到了同样的问题,问题是我在表上创建了触发器,我无法从表中删除记录,它显示相同的错误。删除触发器后它现在可以工作了。

标签: php mysql


【解决方案1】:

MySQL 很可能处于 STRICT 模式。

尝试运行 SET GLOBAL sql_mode='' 或编辑您的 my.cnf 以确保您没有设置 STRICT_ALL_TABLES 或类似内容。

【讨论】:

  • 在 MySQL 中使用严格模式是不好的做法吗?
  • 在执行此操作之前,您可以通过以下方式查看当前值:SELECT @@GLOBAL.sql_mode
  • 这仅适用于 >= 5.7 吗?
【解决方案2】:

MySQL 最有可能处于STRICT 模式,这不一定是坏事,因为您会及早发现错误/问题,而不是盲目地认为一切都按您的预期工作。

更改列以允许为空:

ALTER TABLE `x` CHANGE `display_name` `display_name` TEXT NULL

或者,给它一个空字符串的默认值:

ALTER TABLE `x` CHANGE `display_name` `display_name` TEXT NOT NULL DEFAULT ''

【讨论】:

  • 这是一个更好的解决方案。作为开发人员,您不应该依赖懒惰的编码。始终准确地了解您要放入数据库的内容。严格模式对开发人员有很大好处,因为它有助于识别草率的代码。
  • 这会导致“... TEXT 列不能有默认值”。
  • 空字符串不是一个有效的默认值——它应该是一个空白字符串' '
【解决方案3】:

所有这些答案都是一个好方法,但我认为您不想总是去您的数据库并修改您设置为 NULL 的默认值。

我建议你去 app/User.php 并修改protected $fillable,这样它就会把你用于注册的数据数组中的新字段。

假设您添加了一个名为"first_name" 的新输入字段,您的$fillable 应该是这样的:

protected $fillable = [ 'first_name', 'email', 'password',]; 

这是为我做的。祝你好运!

【讨论】:

  • 你为什么假设 OP 使用 laravel/eloquent?
  • 这是让我着迷的问题。一旦你提到这是特定于 Laravel 和 Eloquent 的,就会投票赞成
  • $fillable 是我收到此错误消息的原因。向我的表和 store() 方法添加了列,但忘记将列名添加到 $fillable!
【解决方案4】:

我也遇到过这个问题,在 laravel 中有两种方法可以解决这个问题。

  1. 第一个是您可以将默认值设置为 null。我给你举个例子:

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('gender');
            $table->string('slug');
            $table->string('pic')->nullable();
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
    

如上例,您可以为该功能设置nullable()。那么当你插入数据时,MySQL 将默认值设置为 null。

  1. 第二个是在您的模型中将您的输入字段设置为protected $fillable 字段。例如:

    protected $fillable = [
        'name', 'email', 'password', 'slug', 'gender','pic'
    ];
    

我认为第二个比第一个好,而且您可以同时设置可为空的功能以及可填充的功能。

【讨论】:

    【解决方案5】:

    另外,我在使用 Laravel 时遇到了这个问题,但通过更改我的数据库架构以允许在我计划从不同表单收集信息的表上允许“空”输入来解决这个问题:

    public function up()
    {
    
        Schema::create('trip_table', function (Blueprint $table) {
            $table->increments('trip_id')->unsigned();
            $table->time('est_start');
            $table->time('est_end');
            $table->time('act_start')->nullable();
            $table->time('act_end')->nullable();
            $table->date('Trip_Date');
            $table->integer('Starting_Miles')->nullable();
            $table->integer('Ending_Miles')->nullable();
            $table->string('Bus_id')->nullable();
            $table->string('Event');
            $table->string('Desc')->nullable();
            $table->string('Destination');
            $table->string('Departure_location');
            $table->text('Drivers_Comment')->nullable();
            $table->string('Requester')->nullable();
            $table->integer('driver_id')->nullable();
            $table->timestamps();
        });
    
    }
    

    ->nullable();补充到最后。这是使用 Laravel。希望这对某人有所帮助,谢谢!

    【讨论】:

      【解决方案6】:

      当我忘记在 Laravel 模型中的 $fillable 数组中添加新的表单字段/数据库列时出现此错误 - 模型正在剥离它们。

      【讨论】:

        【解决方案7】:

        我在使用 Lumen 时也遇到了这个问题,但通过在 .env 文件中设置 DB_STRICT_MODE=false 解决了这个问题。

        【讨论】:

          猜你喜欢
          • 2013-03-04
          • 2019-11-23
          • 1970-01-01
          • 1970-01-01
          • 2021-02-28
          • 2021-10-13
          • 2017-03-02
          • 2020-02-03
          相关资源
          最近更新 更多