MySQL创建表时遇到的几个错误

872 查看

Q1

创建表时的表结构如下:

CREATE TABLE `hack` (
      `Id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
      `CreateTime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
      PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=1211 DEFAULT CHARSET=utf8 COMMENT='hack';

从console导入进去的时候,报错

> ERROR 1067 (42000): Invalid default value for 'CreateTime'

然后打出变量

> `>` show variables like 'sql_mode';
Variable_name Value
sql_mode ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

发现是这两个变量导致了报错:NO_ZERO_IN_DATE & NO_ZERO_DATE

百度了一下,了解到

  • NO_ZERO_DATE

    在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。
  • NO_ZERO_IN_DATE

    在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插   入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。
    

    修改变量:

> `>` set session sql_mode='ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'

Q2

报错

ERROR 1101 (42000): BLOB, TEXT, GEOMETRY or JSON column 'Ovalue' can't have a default value

实际上,textblob字段不允许有缺省值,这是由于strict mode导致的,只要在my-template.ini中去掉

sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

或linux下在my.conf中去掉

sql_mode=""

就行了。

参考

  1. http://blog.csdn.net/xionglang7/article/details/44499307

  2. http://blog.csdn.net/A11085013/article/details/21695617

  3. http://stanlemon.net/2013/03/23/mysql-strict-mode-on-os-x/

  4. http://stackoverflow.com/questions/18762308/how-to-get-rid-of-strict-sql-mode-in-mysql