如何解决MySQL异常SQLSTATE [HY000](常规错误:1364字段”field_name”没有默认值)

本文概述

  • A.逻辑解决方案
  • B.服务器端解决方案
当你尝试在数据库中插入/更新一条记录时, 通常会触发一般错误1364, 在该记录中, 某个字段(即引发异常的字段)不能为null, 但是你尝试将其值设置为null(不是为它提供价值)。通常, 仅当你在严格模式下使用MySQL时才会触发此异常, 你可以通过以下查询获取MySQL服务器正在使用的模式:
SELECT @@sql_mode;

如果遇到此异常, 则可能是因为你启用了严格模式(STRICT_TRANS_TABLES)。在本文中, 我们将与你分享两种防止此异常轻易出现的方法。
A.逻辑解决方案为防止此异常, 只需为触发异常的字段提供一个值或定义该字段可以为null, 那么当你尝试插入记录时, 该值将为null但不会引发错误, 例如列不能为null的示例, 以下查询将引发异常:
INSERT INTO user (column_a, column_b) VALUES ("Value First Column", NULL);

因此, 你可以更改列以使该列可为空:
ALTER TABLE YourTable MODIFY column_b VARCHAR(255) DEFAULT NULL;

就是这样, 该异常不应再出现。
B.服务器端解决方案如果由于使用框架或其他类型的逻辑而无法自己定义列的值, 那么该框架或其他类型的逻辑将首先插入具有null的记录, 然后对其进行更新, 则你可以依靠简单的方法来删除严格的MySQL的。不建议这样做, 因为这样可以防止例如在不能为null的列中插入空值而引发上述异常。所有这些基本上都是作为一种控制措施, 它可以防止你的逻辑失败并阻止你编写松散的代码, 在这些地方你可能会忽略错误的书面逻辑等。
在其他情况下, 你编写的逻辑在你的本地环境中有效, 因为你可能没有在其中设置严格模式, 但是在生产服务器上, 由于该模式它不起作用。在这种情况下, 你可以禁用严格模式来修改MySQL的配置文件(在Windows中为my.ini或在Linux中为my.cnf), 将sql_mode设置为空字符串, 或者删除STRICT_TRANS_TABLES选项以将MySQL设置为” 严格模式” 并使用启用了NO_ENGINE_SUBSTITUTION模式:
[mysqld]sql-mode=""# Or# sql-mode="NO_ENGINE_SUBSTITUTION"

保存更改, 重新启动mysql服务, 该错误将不再显示, 尽管该列不允许, 但该列将设置为null。
【如何解决MySQL异常SQLSTATE [HY000](常规错误:1364字段” field_name” 没有默认值)】编码愉快!

    推荐阅读