为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【概述】 场景 + 问题概述
需要通过rename表来更新表数据
【应用框架及开发适配业务逻辑】
线上库prod,待上线库beta
通过mysql客户端访问tidb,将beta库中表rename到prod中,实现表数据更新。
再对prod库中表做insert into,报错
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘my_table.PRIMARY’
【背景】 做过哪些操作
连接tidb server1,创建2个库beta和prod,beta库中一张表my_table,写入一条数据
create database beta;
CREATE TABLE beta.my_table (name VARCHAR(50), email VARCHAR(100), age INT, city VARCHAR(50), country VARCHAR(50));
INSERT INTO beta.my_table (name, email, age, city, country) VALUES (‘NSerldQ’, ‘bHiNV@example.com’, 19, ‘WHwSzoz’, ‘KyPBL’);
create database prod;
连接tidb server2,rename表,使得beta.my_table变成prod.my_table,并drop beta库。之后往表prod.my_table插入一条数据
rename table beta.my_table to prod.my_table;
drop database beta;
INSERT INTO prod.my_table (name, email, age, city, country) VALUES (‘NSerldQ’, ‘bHiNV@example.com’, 19, ‘WHwSzoz’, ‘KyPBL’);
【现象】 业务和数据库现象
报错:ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘my_table.PRIMARY’
【问题】 当前遇到的问题
报错:ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘my_table.PRIMARY’
【业务影响】
【TiDB 版本】
v8.1.0
【附件】 相关日志及监控
经测试,v7.5.1版本没有此问题,相同操作不会报Duplicate entry ERROR
已测试方案:
1、建表时设置AUTO_ID_CACHE为1,试图使用MySQL兼容模式
测试结果:通过部分tidb server插入数据能够获取全局自增id,但仍有部分tidb server插入数据仍然使用预分配id,导致Duplicate entry
2、建表时设置SHARD_ROW_ID_BITS
测试结果:不起作用,出现Duplicate entry ERROR
3、设置一个自增字段_id作为主键
测试结果:不起作用,出现Duplicate entry ERROR
4、设置一个字段_id作为主键并使用AUTO_RANDOM
测试结果:不报错,但该字段导致无法批量导入数据:tispark datasource api / import into
临时解决方案:
在将表由beta.my_table rename为prod.my_table后,不删除beta库。