建表语句执行报错

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】OceanBase_CE 4.2.1.1
【问题描述】清晰明确描述问题
建表报错
obclient [mt_thing_v2]> CREATE TABLE mtip_topo_map (
id varchar(255) NOT NULL COMMENT ‘主键’,
function_code varchar(255) DEFAULT NULL COMMENT ‘系统编码(拓扑图同时支撑设备流程图和工艺流程图两个功能,这里区分一下)\r\n工艺流程图:process_design\r\n设备流程图:device_connect’,
title varchar(255) DEFAULT NULL COMMENT ‘拓扑图标题’,
image longblob COMMENT ‘缩略图’,
crop_id varchar(64) DEFAULT NULL COMMENT ‘企业id’,
theme varchar(255) DEFAULT NULL COMMENT ‘样式主题’,
style json DEFAULT NULL COMMENT ‘基础样式’,
figure_display tinyint(1) DEFAULT NULL COMMENT ‘图注是否显示’,
legend_display tinyint(1) DEFAULT NULL COMMENT ‘图例是否显示’,
balance_display tinyint(1) DEFAULT NULL COMMENT ‘平衡表是否显示’,
create_user varchar(255) DEFAULT NULL COMMENT ‘创建人’,
create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
update_user varchar(255) DEFAULT NULL COMMENT ‘最后更新人’,
update_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT ‘更新时间’,
remark varchar(255) DEFAULT NULL COMMENT ‘备注’,
width double DEFAULT NULL COMMENT ‘画布宽度’,
height double DEFAULT NULL COMMENT ‘画布高度’,
play_back_enable tinyint DEFAULT ‘0’ COMMENT ‘是否可以回放’,
main_map_flag tinyint DEFAULT ‘0’ COMMENT ‘主图标记’,
grid_size int DEFAULT NULL COMMENT ‘网格间距’,
grid_fixed tinyint(1) DEFAULT NULL COMMENT ‘图中元素是否与网格吸附’,
→ PRIMARY KEY (id) USING BTREE
→ ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT=‘工艺流程图’;
ERROR 1215 (HY000): Child column ‘map_id’ data length cannot be less than parent column ‘id’ data length
[192.168.36.10:2882] [2024-01-09 14:21:27.093189] [YB42C0A8240A-00060BAAA6A18BD0-0-0]

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)
oblog.rar (8.8 KB)

2 个赞

看下表名
select * from oceanbase.CDB_OB_TABLE_LOCATIONS where table_id=‘500231’ limit 5;

1 个赞

obclient [oceanbase]> select * from oceanbase.CDB_OB_TABLE_LOCATIONS where TABLE_ID=‘500231’ limit 5;
±----------±--------------±---------------±---------±-----------±---------------±------------------±-----------±--------------±----------±------±------±--------------±---------±---------±-------------±----------------±----------±----------------±--------------±---------+
| TENANT_ID | DATABASE_NAME | TABLE_NAME | TABLE_ID | TABLE_TYPE | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | DATA_TABLE_ID | TABLET_ID | LS_ID | ZONE | SVR_IP | SVR_PORT | ROLE | REPLICA_TYPE | DUPLICATE_SCOPE | OBJECT_ID | TABLEGROUP_NAME | TABLEGROUP_ID | SHARDING |
±----------±--------------±---------------±---------±-----------±---------------±------------------±-----------±--------------±----------±------±------±--------------±---------±---------±-------------±----------------±----------±----------------±--------------±---------+
| 1004 | mt_thing_v2 | mtip_topo_line | 500231 | USER TABLE | NULL | NULL | NULL | NULL | 200110 | 1001 | zone1 | 192.168.36.10 | 2882 | LEADER | FULL | NONE | 500231 | NULL | NULL | NULL |
| 1004 | mt_thing_v2 | mtip_topo_line | 500231 | USER TABLE | NULL | NULL | NULL | NULL | 200110 | 1001 | zone2 | 192.168.36.11 | 2882 | FOLLOWER | FULL | NONE | 500231 | NULL | NULL | NULL |
| 1004 | mt_thing_v2 | mtip_topo_line | 500231 | USER TABLE | NULL | NULL | NULL | NULL | 200110 | 1001 | zone3 | 192.168.36.12 | 2882 | FOLLOWER | FULL | NONE | 500231 | NULL | NULL | NULL |
±----------±--------------±---------------±---------±-----------±---------------±------------------±-----------±--------------±----------±------±------±--------------±---------±---------±-------------±----------------±----------±----------------±--------------±---------+
3 rows in set (0.362 sec)

1 个赞

show table status like ‘% mtip_topo_line%’;

obclient [mt_thing_v2]> show table status like ‘%mtip_topo_line%’;
±---------------±----------±--------±-----------±-----±---------------±------------±----------------±-------------±----------±---------------±---------------------------±---------------------------±-----------±-------------------±---------±------------------------------------------------------------------------------------------------------------------------------------------------±----------------------------------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
±---------------±----------±--------±-----------±-----±---------------±------------±----------------±-------------±----------±---------------±---------------------------±---------------------------±-----------±-------------------±---------±------------------------------------------------------------------------------------------------------------------------------------------------±----------------------------------+
| mtip_topo_line | oceanbase | 0 | DYNAMIC | 0 | 0 | 0 | NULL | NULL | NULL | NULL | 2024-01-09 18:06:19.000000 | 2024-01-09 18:06:19.000000 | NULL | utf8mb4_general_ci | 0 | ROW_FORMAT = DYNAMIC COMPRESSION = ‘zstd_1.3.8’ REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | 工艺流程图连接线记录表 |
±---------------±----------±--------±-----------±-----±---------------±------------±----------------±-------------±----------±---------------±---------------------------±---------------------------±-----------±-------------------±---------±------------------------------------------------------------------------------------------------------------------------------------------------±----------------------------------+
1 row in set (0.167 sec)

select now(); 看下本地时间。 看这个表今天18点06分已经创建上了,报错提示有点不太符合预期。

obclient [oceanbase]> select now();
±--------------------+
| now() |
±--------------------+
| 2024-01-09 14:57:27 |
±--------------------+
1 row in set (0.002 sec)

服务器的时间是正常的,当前时间。
这个建表语句,是客户端执行的,应该是有时区的影响, 增加了8个小时

上午10点 创建表mtip_topo_map 下午再创建报错ERROR 1215 (HY000): Child column ‘map_id’ data length cannot be less than parent column ‘id’ data length。
换个表名后 正常,基本确认表名重复导致,但报错返回不符合预期,内部先定位下。 :hand_with_index_finger_and_thumb_crossed:

2 个赞

show table status 展示的create_time 和 update_time 是版本缺陷,4.2.1.3版本已经修复。暂时不影响使用。

集群是否有主备租户?

SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL;
这个sql 能看到是否有外键约束关系。

是三节点的集群,有主备租户

原因:因为你关了 foreign_key_checks 这个系统变量,然后你先创建了外键子表,之后才创建外键父表,父表和子表的外键列不匹配,所以报错了。

解决:你先查下和外键相关的字典视图 information_schema.xxx(忘了叫啥了,和 MySQL 兼容的,自己百度查下吧),然后根据外键父表名 mtip_topo_map 在字典视图里找到子表名,看看子表里 map_id 多长,再调整父表或者子表的列长度,把父表 id 列调小,或者把子表 map_id 列调大,保证子表外键列的长度不小于父表外键列就好了。