【MySql】Mysql ERROR 1067: Invalid default value for ‘dat

2019-11-09 15:57 来源:未知

在给一个表添加字段的时候,忽然发现会报一个date类型的字段的默认值错误,郁闷~

问题描述:修改字段默认值时报错ERROR 1067 (42000): Invalid default value for 'phone'

最近需要对业务的订单表进行分区,先在自己本机测试,在创建测试表就报错了:

遇到的问题:Mysql修改字段默认值为非空时遇到ERROR 1138 (22004): Invalid use of NULL value

这是我在Mysql数据库中,新建一张表时出现的问题,代码如下

经过排查,原来是MySQL的配置问题,在wamp下,MySQL 5.7里是没有设置 SQL_MODE 的。

问题原因:设置的默认值不符合当前字段的类型

CREATE TABLE `test_order` (
    `ORDER_NUM` bigint(20) NOT NULL COMMENT '订单号',
    `CREATE_TIME` timestamp NULL DEFAULT '0000-00-00 00:00:00',
    KEY `IAC_ORDER_N1` (`ORDER_NUM`) USING BTREE,
    KEY `idx_create_time` (`CREATE_TIME`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT

ERROR 1067 (42000): Invalid default value for 'FAILD_TIME'  

图片 1

-- 创建表
CREATE TABLE seckill(
  `seckill_id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品库存id',
  `name` varchar(120) NOT NULL COMMENT '商品名称',
  `number` int NOT NULL COMMENT '库存数量',

  -- 此行不会报错,因为默认值使用CURRENT_TIMESTAMP
  `start_time` TIMESTAMP NOT NULL COMMENT '秒杀开启时间',

  -- 此行会报错,因为默认值使用“0000-00-00 00:00:00”,
  -- Mysql 5.7版本后的SQL_MODE默认为strict(NO_ZERO_DATE),
  -- 所以第二个出现报错
  -- 解决方案:SET SQL_MODE = 'ALLOW_INVALID_DATES';

  `end_time` TIMESTAMP NOT NULL COMMENT '秒杀结束时间',
  `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (seckill_id),
  key idx_start_time(start_time),
  key idx_end_time(end_time),
  key idx_create_time(create_time)
)ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=UTF8 COMMENT='秒杀库存表';

1.my.ini文件中找到 [mysqld]

解决办法:好像解决不了……除非不设这样的默认值,或修改字段类型

(对TIMESTAMP类型的子段如果不设置缺省值或没有标志not null时候在创建表时会报这个错误)

问题原因:gou表里name字段当前有值为null(空值),所以改变name列为非空时报错。

我的解决方案是:
SET SQL_MODE = 'ALLOW_INVALID_DATES';
如果有更好的解决方案,请留言。

2.如果没有SQL_MODE,就添加,有就修改一下

这是因为sql_mode中的NO_ZEROR_DATE导制的,在strict mode中不允许'0000-00-00'作为合法日期

解决方案:把name列所有null值修改为非空的字符再执行即可

sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

使用下面的命令查看sql_mode
业务库:

图片 2

3.重启MySQL;

mysql>show variables like 'sql_mode';

 

Variable_name
sql_mode

注:图片里演示了两种修改字段的命令CHANGE和MODIFY,实际使用中只需要一种。

本机测试:

 

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_DATE改为下面的ALLOW_INVALID_DATES

mysql> set sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

上面的设置是临时设置,在重新登陆后,该设置又恢复为NO_ZERO_DATE

版权声明:本文由19463331韦德国际发布于计算机网络,转载请注明出处:【MySql】Mysql ERROR 1067: Invalid default value for ‘dat