General error: 1364 Field 'xxxx' doesn't have a default value

General error: 1364 Field 'xxxx' doesn't have a default value

我有一个项目,它进行插入,不向 NOT NULLNO DEFAULT[=18= 的列插入任何值(不是空值) ] 值。 我相信在缺少必需值的情况下插入是不可能的,它总是会抛出一个错误:Field 'xxxx' 没有默认值。但是我看到 here mysql 可以设置为

sql-mode="NO_ENGINE_SUBSTITUTION"

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

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

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

这是一个例子:

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

因此,如果有人想知道在 PHP/PDO 中某个具体会话的情况:

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