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>