Tidb 与 Mysql 关于not null不兼容

1、TiDB的表定义里面明确指定了【NOT NULL】了,所以值肯定不能为NULL了,否则就违反了表的定义要求了,tidb这里的做法更加严谨、可靠,是符合预期的,应该推荐这个用法。

2、如果想要在TiDB v8.5.1里的表插入date_add为NULL值,那么需要楼主修改表结构的定义,把date_add字段的【NOT NULL】去掉,即改为:date_add timestamp DEFAULT CURRENT_TIMESTAMP 。

具体可以参考如下:
3、5.7.54确实如楼主所言,即便设置了NOT NULL,还是可以插入NULL值。(不按照预期来)

mysql> select version();
+----------------+
| version()      |
+----------------+
| 5.7.54-251-log |
+----------------+
1 row in set (0.00 sec)

mysql> show variables like '%sql_mode%' ;
+---------------------------+------------------------------------------------------------------------------------------------------------------------+
| Variable_name             | Value                                                                                                                  |
+---------------------------+------------------------------------------------------------------------------------------------------------------------+
| sql_mode                  | STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------------------+------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.01 sec)

mysql> create table t (id int(11), update_time timestamp NULL DEFAULT NULL , date_add timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, primary key(id)) ;
Query OK, 0 rows affected (0.08 sec)

mysql> insert into t (id,update_time,date_add) values (1,NULL,NULL) ;
Query OK, 1 row affected (0.00 sec)

mysql> select * from t;
+----+-------------+---------------------+
| id | update_time | date_add            |
+----+-------------+---------------------+
|  1 | NULL        | 2025-06-25 09:34:32 |
+----+-------------+---------------------+
1 row in set (0.00 sec)

mysql> 

4、TiDB v8.5.1,可以通过去掉 NOT NULL限制实现插入NULL值。

  • 对于设置了NOT NULL属性的列,不支持插入NULL值,符合定义,不存在问题。严谨可靠!
mysql> select version();
+--------------------+
| version()          |
+--------------------+
| 8.0.11-TiDB-v8.5.1 |
+--------------------+
1 row in set (0.00 sec)

mysql> 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 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` int NOT NULL,
  `update_time` timestamp NULL DEFAULT NULL,
  `date_add` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)

mysql> insert into t (id,update_time,date_add) values (1,NULL,NULL) ;
ERROR 1048 (23000): Column 'date_add' cannot be null

  • 去掉NOT NULL限制后,字段列可以插入NULL值。
mysql> create table t1 (id int(11), update_time timestamp NULL DEFAULT NULL , date_add timestamp DEFAULT CURRENT_TIMESTAMP, primary key(id)) ;
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int NOT NULL,
  `update_time` timestamp NULL DEFAULT NULL,
  `date_add` timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.00 sec)

mysql> insert into t1 (id,update_time,date_add) values (1,NULL,NULL) ;
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1 ;
+----+-------------+----------+
| id | update_time | date_add |
+----+-------------+----------+
|  1 | NULL        | NULL     |
+----+-------------+----------+
1 row in set (0.00 sec)

mysql> insert into t1 (id,update_time) values (2,NULL) ;
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1 ;
+----+-------------+---------------------+
| id | update_time | date_add            |
+----+-------------+---------------------+
|  1 | NULL        | NULL                |
|  2 | NULL        | 2025-06-25 09:32:19 |
+----+-------------+---------------------+
2 rows in set (0.00 sec)

mysql>