ERROR 1364 (HY000): Field 'xxx' doesn't have a default value

【 TiDB 使用环境`】Dev
【 TiDB 版本】v6.1.0
【遇到的问题】
由于无法用Create Table select 命令,使用show create table得到表定义,然后手工创建表后,插入数据时候,遇上ERROR 1364 (HY000): Field ‘xxx’ doesn’t have a default value
【复现路径】随时可以再现
【问题现象及影响】

  1. 先创建原表
    create table testrb(id bigint(20) auto_random primary key,name varchar(2) default null);

  2. insert 记录
    MySQL [raydb]> insert into testrb(name) values(‘tr’);
    Query OK, 1 row affected (0.031 sec)

MySQL [raydb]> select * from testrb;
±--------------------±-----+
| id | name |
±--------------------±-----+
| 2017612633061982209 | tr |
±--------------------±-----+
1 row in set (0.003 sec)

  1. 用show create table获得定义
    MySQL [raydb]> show create table testrb;
    ±-------±------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------+
    | Table | Create Table |
    ±-------±------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------+
    | testrb | CREATE TABLE testrb (
    id bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,
    name varchar(2) DEFAULT NULL,
    PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
    ±-------±------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------+
    1 row in set (0.005 sec)

  2. 然后仅把表名更改,复制定义,手工运行
    MySQL [raydb]> CREATE TABLE testrb2 (
    -> id bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,
    -> name varchar(2) DEFAULT NULL,
    -> PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */
    -> ) ;
    Query OK, 0 rows affected (0.122 sec)

  3. 运行相同insert 仅表名不同
    MySQL [raydb]> insert into testrb2(name) values(‘tr’);
    ERROR 1364 (HY000): Field ‘id’ doesn’t have a default value

  4. 当然指定ID值是没问题,但失去了auto_random意义
    MySQL [raydb]> insert into testrb2(id,name) values(‘1221321’,‘tr’);
    Query OK, 1 row affected (0.011 sec)

MySQL [raydb]> select * from testrb2;
±--------±-----+
| id | name |
±--------±-----+
| 1221321 | tr |
±--------±-----+
1 row in set (0.004 sec)

show create table显示的如果和手工创建的不等价,那其意义就没有了。难道AUTO_RANDOM情况
有啥问题

【附件】

  1. TiUP Cluster Display 信息
  2. TiUP Cluster Edit Config 信息
  3. TiDB- Overview 监控

是不是你连接的时候没加–comments,导致/*T![auto_rand] AUTO_RANDOM(5) */, 这个没生效。你show create table看看表结构。

是啊,因为auto_random是在comments里面的关系。 但这个和show create table不就是和实际不等效了吗。如果我们用mysqldump到处定义,就会有问题了。
mysqldump -h 192.168.0.xxx -P 4000 -u root -pxxx -B raydb -d > test.log
DROP TABLE IF EXISTS testrb;
/*!40101 SET @saved_cs_client = @@character_set_client /;
/
!40101 SET character_set_client = utf8 */;
CREATE TABLE testrb (
id bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,
name varchar(2) DEFAULT NULL,
PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=30001 /;
/
!40101 SET character_set_client = @saved_cs_client */;


– Table structure for table testrb2

DROP TABLE IF EXISTS testrb2;
/*!40101 SET @saved_cs_client = @@character_set_client /;
/
!40101 SET character_set_client = utf8 */;
CREATE TABLE testrb2 (
id bigint(20) NOT NULL,
name varchar(2) DEFAULT NULL,
PRIMARY KEY (id) /*T![clustered_index] CLUSTERED /
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
/
!40101 SET character_set_client = @saved_cs_client */;

我试了下dumpling也是一样
tiup dumpling -B raydb -uroot --filetype sql -o /tmp/test.log -L dump.log -pxxx -d
[tidb@jeeppoc ~]$ cat /tmp/test.log/raydb.testrb-schema.sql
/!40101 SET NAMES binary/;
CREATE TABLE testrb (
id bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,
name varchar(2) DEFAULT NULL,
PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=30001 */;

comment没生效。mysql 再连接 用-c命令

连接的时候记得加-c就行了

多谢,问题解决了。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。