导入有复合主键的表到tidb系统中,在新环境上测试,发现插入的数据破坏了原有系统的规则

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:V3.0.8
  • 【问题描述】:

原来业务有一张表,通过loader导入到tidb-server中,现系统中有两个tidb-servet,前端是负载均衡搭配两个后端连接,通过业务测试,发现入库的数据破坏了原来sql的规则。其中原来的表结构是这样的

连上tidb后,通过业务数据入库复合主键和唯一主键的约束规则全部破坏了,出现了重复数据,相同的复合主键内容

怎么保证导入到tidb中,维持原来mysql建表时候制定的约束规则?

1、请仔细看下表的 pk 和 uk 定义的范围:

1)pk 是:tid + position

2)uk 是:pid

2、pk 冲突:你那里指出的复合主键的重复是指哪两个列的组合 value 出现了冲突?

3、uk 冲突:从上面的结果,并未看到 pid 值重复的列,可以通过下述 sql 确认下:

select count(uk),uk from table_name group by uk

看不出图里面哪些是重复的。 tid , position 是联合主键,你的截图里面没有包含,position 列,另外 pid 暂时也没有看出有重复的。或者可以通过 SQL 的方式对主键进行分组看超过 1 行数据有多少。

是这样的,业务逻辑是tid 和 position是复合主键,tid是文章id,position是楼层,第一次发文章是默认1楼,下面有人回复,就是tid相同,position+1

然后pid 是唯一索引 之前我没有把position这一列移过来,下图就是,你按照我的逻辑分析一下就明白

附上原来正常的业务流程

上述表达的是否理解

麻烦仔细看下数据。没有重复的。

还有复合主键,position第一次发帖的时候应该是1 ,现在都不是从1开始,pid一定不能一样,tid一样的是同一个帖子,第一次发帖的时候position默认为1,下面有人回复,tid不变,position为2,以此类推,我都截图这么明白,你们还看不明白?????

请问 position 列在 MySQL 是如何实现基于 tid 列自增的。

你可以参考下mysql的复合主键索引

这样设置就可以保持position根据tid不变,而position自增

TiDB 与 MySQL 的自增 ID 存在兼容性差异。可以参考下面的链接:

我还发现一个问题,我原来的数据的存储引擎和结构前后发生了变化 导入前

导入后

请帮忙指导下怎么做到兼容,因为这个是我们业务核心一个表,必须要兼容才能使用tidb

Table Engine 的 option 只是作为兼容 MySQL 保留。没有实际性意义在 TiDB 内。另外联合主键自增暂时在 TiDB 内是不支持的。所以如果要实现原来的效果的话需要在应用侧做兼容。