【问题标题】:MySQL - Field <myfield> doesn't have a default valueMySQL - 字段 <myfield> 没有默认值
【发布时间】:2015-11-09 06:25:14
【问题描述】:

我知道某个字段没有默认值。

我一直在使用 MySQL 5.5.28,只要我在没有在该字段上指定值的情况下插入,它就可以工作。该字段为 TINYINT,默认情况下,在创建表期间不指定任何值且不声明默认值,在 INSERT 语句期间将在该字段中插入值 0。

但是,在更新到 MySQL 5.5.30 后,查询不再起作用并返回 Field doesn't have a default value

我一直在查看更改日志,但没有发现任何线索表明 Integer 的默认值发生了变化。

MySQL 5.5.29:http://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-29.html#mysqld-5-5-29-feature

MySQL 5.5.30:http://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-30.html

测试查询: MyTable 具有字段 MyField1MyField2

INSERT INTO MyTable(MyField2)VALUES('MICHAEL');

MySQL 5.5.28 上的结果:

MyField1 | MyField2
0 |迈克尔

警告:1 行受影响,1 条警告:1364 字段“MyField1”没有默认值

MySQL 5.5.30 上的结果:

数据没有变化并引发错误
错误代码:1364。字段“MyField1”没有默认值

INSERT INTO MyTable(MyField1, MyField2)VALUES(0, 'MICHAEL');

上述查询将起作用。

【问题讨论】:

    标签: mysql insert


    【解决方案1】:

    在第一台服务器中没有启用严格的 sql 模式,而在第二台服务器中启用了。阅读有关严格模式的更多信息in the mysql documentation

    具体来说:

    如果严格模式未生效,MySQL 会为无效或缺失值插入调整值并产生警告(请参阅第 13.7.5.40 节,“显示警告语法”)。在严格模式下,您可以使用 INSERT IGNORE 或 UPDATE IGNORE 来产生这种行为。

    【讨论】:

    • 谢谢影子。找到了配置。更新服务器后,sql_mode 已设置为 TRADITIONAL,如果没有默认值,则不允许插入而不指定值。我想我可能必须再次检查表以在当前 sql_mode 中应用必要的更改。我可能需要坚持使用我认为比默认 sql_mode 更安全的当前配置。
    • 是的,它更安全。
    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2012-09-25
    • 2018-03-19
    • 2014-11-09
    相关资源
    最近更新 更多