bitscn.com
mysql field * doesn't have a default value解决方法
mysql 5中,出现错误提示:
field 'id' doesn't have a default value
解决方法一:
打开my.ini,查找
sql-mode=strict_trans_tables,no_auto_create_user,no_engine_substitution
修改为
sql-mode=no_auto_create_user,no_engine_substitution
然后重启mysql
解决方法二:
mysql 5 uses a strict mode which needs to be disabled.
in windows, goto start-->programs-->mysql->mysql instance config wizard. follow through the reconfigure instance option-->detailed configuration-->continue next a few screens. at the bottom under enable tcp/ip option there is 'enable strict mode'. deslect this option (no tick). save changes and mysql will restart
原来在mysql 5.0.2之前,mysql对非法或不当值并不严厉,而且为了数据输入还会强制将它们变为合法值。在mysql 5.0.2和更高版本中,保留了以前的默认行为,但你可以为不良值选择更传统的处理方法,从而使得服务器能够拒绝并放弃出现不良值的语句。本节介绍了mysql的默认行为(宽大行为),新的严格的sql模式,以及它们的区别。
如果你未使用严格模式,下述情况是真实的。如果将“不正确”的值插入到列,如将null值插入非null列,或将过大的数值插入数值列,mysql会将这些列设置为“最可能的值”,而不是生成错误信息。
· 如果试图将超范围的值保存到数值列,mysql服务器将保存0(最小的可能值)取而代之,或最大的可能值。
· 对于字符串,mysql或保存空字符串,或将字符串尽可能多的部分保存到列中。
· 如果打算将不是以数值开头的字符串保存到数值列,mysql将保存0。
· mysql允许将特定的不正确日期值保存到date和datetime列(如“2000-02-31”或“2000-02-00”)。其观点在于,验证日期不是sql服务器的任务。如果mysql能保存日期值并准确检索相同的值,mysql就能按给定的值保存它。如果日期完全不正确(超出服务器能保存的范围)将在列中保存特殊的日期值“0000-00-00”取而代之。
· 如果试图将null值保存到不接受null值的列,对于单行insert语句,将出现错误。对于多行insert语句或insert into ... select语句,mysql服务器会保存针对列数据类型的隐含默认值。一般情况下,对于数值类型,它是0,对于字符串类型,它是空字符串(''),对于日期和时间类型是“zero”。
· 如果insert语句未为列指定值,如果列定义包含明确的default子句,mysql将插入默认值。如果在定义中没有这类default子句,mysql会插入列数据类型的隐含默认值。
采用前述规则的原因在于,在语句开始执行前,无法检查这些状况。如果在更新了数行后遇到这类问题,我们不能仅靠回滚解决,这是因为存储引擎可能不支持回滚。中止语句并不是良好的选择,在该情况下,更新完成了“一半”,这或许是最差的情况。对于本例,较好的方法是“仅可能做到最好”,然后就像什么都未发生那样继续。
在mysql 5.0.2和更高版本中,可以使用strict_trans_tables或strict_all_tables sql模式,选择更严格的处理方式。
strict_trans_tables的工作方式:
· 对于事务性存储引擎,在语句中任何地方出现的不良数据值均会导致放弃语句并执行回滚。
· 对于非事务性存储引擎,如果错误出现在要插入或更新的第1行,将放弃语句。(在这种情况下,可以认为语句未改变表,就像事务表一样)。首行后出现的错误不会导致放弃语句。取而代之的是,将调整不良数据值,并给出告警,而不是错误。换句话讲,使用strict_trans_tables后,错误值会导致mysql执行回滚操作,如果可以,所有更新到此为止。
要想执行更严格的检查,请启用strict_all_tables。除了非事务性存储引擎,它与strict_trans_tables等同,即使当不良数据出现在首行后的其他行,所产生的错误也会导致放弃语句。这意味着,如果错误出现在非事务性表多行插入或更新过程的中途,仅更新部分结果。前面的行将完成插入或更新,但错误出现点后面的行则不然。对于非事务性表,为了避免这种情况的发生,可使用单行语句,或者在能接受转换警告而不是错误的情况下使用strict_trans_tables。要想在第1场合防止问题的出现,不要使用mysql来检查列的内容。最安全的方式(通常也较快)是,让应用程序负责,仅将有效值传递给数据库。
有了严格的模式选项后,可使用insert ignore或update ignore而不是不带ignore的insert或update,将错误当作告警对待。
bitscn.com