作为背景知识,我们在工作中使用了 Zend Framework 2 和 Doctrine。 Doctrine 总是会为我们自己不填充的值插入 NULL
。通常这是可以的,因为如果该字段具有默认值,那么它应该使用该默认值填充该字段。
对于我们运行 MySQL 5.6.16 的服务器之一,如下所示的查询运行并执行良好。虽然 NULL
被插入到一个不可为 null 的字段中,但 MySQL 会在插入时使用其默认值填充该字段。
在我们另一台运行 MySQL 5.6.20 的服务器上,我们运行下面的查询,但它失败了,因为它提示“field_with_default_value”不能为空。
INSERT INTO table_name(id, field, field_with_default_value)
VALUES(id_value, field_value, NULL);
Doctrine 本身不支持将“DEFAULT”传递到它构建的查询中,因此这不是一个选项。我想这一定是某种 MySQL 服务器,好像它在一个版本中工作正常但在另一个版本中却不行,但不幸的是我不知道这可能是什么。我们的 SQL 模式在两台服务器上也是相同的 ('NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
)。
我应该提一下,如果我真的在 Workbench 中运行上面的 SQL,它仍然不会以同样的方式工作。所以这不是真正的 Doctrine 问题,但绝对是某种 MySQL 问题。
如有任何帮助,我们将不胜感激。
最佳答案
我在升级 MySQL 后遇到了同样的问题。原来有一个设置允许对 NOT NULL 时间戳字段进行 NULL 插入并获取默认值。
explicit_defaults_for_timestamp=0
关于php - 使用默认值将 NULL 插入 NOT NULL 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26023246/