开发者社区> 问答> 正文

Table无主键时,insert数据会导致columnInfo和tableMeta的size不匹配,

问题描述如题,以下为error log

2015-12-03 16:27:55.718 [destination = , address = , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:crm[com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: parse row data failed. Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: column size is not match for table:s1.t1,6 vs 5 ]

原提问者GitHub用户Librazk

展开
收起
绿子直子 2023-05-09 16:03:42 165 0
2 条回答
写回答
取消 提交回答
  • column size is not match for table:s1.t1,6 vs 5. 应该是做了字段删除操作,和主键无关

    使用新RDS的自主用户权限,对canal授权super权限

    原回答者GitHub用户agapple

    2023-05-10 11:02:11
    赞同 展开评论 打赏
  • CSDN全栈领域优质创作者,万粉博主;InfoQ签约博主;华为云享专家;华为Iot专家;亚马逊人工智能自动驾驶(大众组)吉尼斯世界纪录获得者

    当表没有主键时,MySQL在插入数据时会使用默认的行值填充主键列。如果该表中还有其他列,则MySQL将使用默认值来填充这些列。

    由于MySQL在插入数据时需要知道表的结构信息,因此它会使用tableMeta对象来获取表的结构信息。而columnInfo对象则包含了表中每个列的信息,包括列名、数据类型、是否为主键等。

    当插入数据时,MySQL会根据列信息和行值来生成相应的SQL语句。如果列信息和行值不匹配,则会导致插入失败或者插入的数据与预期不符。

    因此,当表没有主键时,为了避免出现columnInfo和tableMeta的size不匹配的情况,可以在插入数据之前手动设置主键列的值。例如:

    
    INSERT INTO table_name (col1, col2, col3) VALUES (val1, val2, val3);
    SET @id = LAST_INSERT_ID();
    UPDATE table_name SET col1 = @id WHERE id = val1;
    
    
    

    在这个例子中,我们手动设置了主键列col1的值为@id,然后通过更新语句将主键列的值更新为插入的主键值val1。这样就可以避免columnInfo和tableMeta的size不匹配的问题了。

    2023-05-10 09:21:19
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载