searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

TeleDB一个timestamp类型的字段写入报错问题

2024-06-28 10:03:03
6
0

一、问题描述

线上插入SQL的时候遇到一个报错:

mysql> insert into  tete values(11,null);
ERROR 1048 (23000): Column 'createTime' cannot be null
 
二、问题分析
查看表结构:
mysql> show create table tete\G
*************************** 1. row ***************************
       Table: tete
Create Table: CREATE TABLE `tete` (
  `id` int NOT NULL,
  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)

查看参数

mysql> show variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON    |
+---------------------------------+-------+
1 row in set (0.00 sec)
 
explicit_defaults_for_timestamp 系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法。
当explicit_defaults_for_timestamp=ON时,如果timestamp列被加上了not null属性,并且没有指定默认值。这时如果向表中插入记录,但是没有给该TIMESTAMP列指定值的时候,如果strict sql_mode被指定了,那么会直接报错。
当explicit_defaults_for_timestamp=OFF时,如果timestamp列没有显式的指明null属性,那么该列会被自动加上not null属性(而其他类型的列如果没有被显式的指定not null,那么是允许null值的),如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。
 
三、问题解决
所以这里为了把文章开始的SQL执行成功,可以把explicit_defaults_for_timestamp设为OFF
mysql> set global explicit_defaults_for_timestamp=off;
Query OK, 0 rows affected, 1 warning (0.00 sec)

 接着再执行文章开头的SQL可以执行成功。

mysql> insert into  tete values(11,null);
Query OK, 1 row affected (0.01 sec)

mysql> select * from tete where id =11;
+----+---------------------+
| id | createTime          |
+----+---------------------+
| 11 | 2024-06-28 11:21:48 |
+----+---------------------+
1 row in set (0.00 sec)

 

 

0条评论
0 / 1000
xinjiefeng
8文章数
0粉丝数
xinjiefeng
8 文章 | 0 粉丝
原创

TeleDB一个timestamp类型的字段写入报错问题

2024-06-28 10:03:03
6
0

一、问题描述

线上插入SQL的时候遇到一个报错:

mysql> insert into  tete values(11,null);
ERROR 1048 (23000): Column 'createTime' cannot be null
 
二、问题分析
查看表结构:
mysql> show create table tete\G
*************************** 1. row ***************************
       Table: tete
Create Table: CREATE TABLE `tete` (
  `id` int NOT NULL,
  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)

查看参数

mysql> show variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON    |
+---------------------------------+-------+
1 row in set (0.00 sec)
 
explicit_defaults_for_timestamp 系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法。
当explicit_defaults_for_timestamp=ON时,如果timestamp列被加上了not null属性,并且没有指定默认值。这时如果向表中插入记录,但是没有给该TIMESTAMP列指定值的时候,如果strict sql_mode被指定了,那么会直接报错。
当explicit_defaults_for_timestamp=OFF时,如果timestamp列没有显式的指明null属性,那么该列会被自动加上not null属性(而其他类型的列如果没有被显式的指定not null,那么是允许null值的),如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。
 
三、问题解决
所以这里为了把文章开始的SQL执行成功,可以把explicit_defaults_for_timestamp设为OFF
mysql> set global explicit_defaults_for_timestamp=off;
Query OK, 0 rows affected, 1 warning (0.00 sec)

 接着再执行文章开头的SQL可以执行成功。

mysql> insert into  tete values(11,null);
Query OK, 1 row affected (0.01 sec)

mysql> select * from tete where id =11;
+----+---------------------+
| id | createTime          |
+----+---------------------+
| 11 | 2024-06-28 11:21:48 |
+----+---------------------+
1 row in set (0.00 sec)

 

 

文章来自个人专栏
性能分析
6 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0