【问题标题】:General error: 1364 Field 'xxxx' doesn't have a default value一般错误:1364 字段“xxxx”没有默认值
【发布时间】:2017-03-02 17:39:29
【问题描述】:

我有一个项目,它插入不插入任何值(非空值)到具有 NOT NULLNO DEFAULT 值的列。 我认为在缺少必需值的情况下进行插入是不可能的,并且它总是会引发错误:字段'xxxx'没有默认值。但正如我所见here mysql 可以设置为

sql-mode="NO_ENGINE_SUBSTITUTION"

我很困惑,因为我认为这很危险。如果我将其关闭,它将适用于所有项目,并且可能非常糟糕。所以我该怎么做?是否可以只为一个 mysql 数据库设置模式,而其他数据库将处于 STRICT 模式?你怎么看待这件事?是不是问题?

【问题讨论】:

    标签: mysql mode strict


    【解决方案1】:

    sql-mode 系统变量在全局和会话级别都可用。这意味着您必须为整个服务器或特定连接设置它。因此,无法在服务器级别为 DB 子集配置此功能。但是,您可以在建立连接时指定 sql 模式。所以这些连接将在严格模式下运行。

    【讨论】:

    • 我希望也可以将会话设置为 NO_ENGINE_SUBSTITUTION。它在 php 中会是什么样子?
    • 我不是 PHP 专家。如果连接器上没有选项,您可能必须在执行其他查询之前执行“SET SESSION sql_mode = ''”。我假设您可以使用相同的连接执行多个查询。希望您不要到处创建连接。
    • 谢谢。我有它。在 PHP/PDO stackoverflow.com/questions/6975351/…
    【解决方案2】:

    我建议的解决方案是创建一个触发器,这样当没有值时它会在该列中插入一个空值

    这是一个例子:

    CREATE TRIGGER upd_check BEFORE UPDATE ON account
         FOR EACH ROW
         BEGIN
             IF NEW.amount < 0 THEN
                 SET NEW.amount = 0;
             END IF;
    END;
    

    【讨论】:

    • 项目快完成了,所以不可能为所有表创建触发器...
    【解决方案3】:

    所以如果有人想知道它在 PHP/PDO 中对于一个具体会话的样子:

    $pdo = new PDO(
         $dsn, 
         $username, 
         $password, 
         array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="NO_ENGINE_SUBSTITUTION"') 
    );
    

    【讨论】:

      猜你喜欢
      • 2019-11-23
      • 1970-01-01
      • 2021-02-28
      • 2021-10-13
      • 2020-02-03
      • 2020-02-27
      • 2020-07-23
      • 2016-06-13
      • 2021-01-18
      相关资源
      最近更新 更多