键盘撒一把冻干,我家猫也能来上班。——粥师傅 
(你看我锤不锤你就完事了)
| 
 | 
 | 
 | 
 | 
 | 
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
顺带一提,以下SQL执行等全程都使用弹内DMS平台进行操作。 
DELETE FROM MY_TABLE WHERE group = 'bad_group';直接执行上面这个SQL进行普通数据变更可行吗?显示不行,有经验的同学都知道,在千万量级下,清理大量数据会超过binlog限制,导致SQL无法被执行。
| 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
| 
 | 
 | 
 | 
 | 
| 
 | 
 | 
 | 
 | 
| 
 | 
 | 
 | 
 | 
| 
 | 
 | 
 | 
 | 
-- 将正常数据复制到临时表CREATE TABLE TEMP_TABLE AS SELECT * FROM MY_TABLE WHERE group <> 'bad_group';
-- 删除原表DROP TABLE MY_TABLE;
-- 将临时表重命名为原表RENAME TABLE TEMP_TABLE TO MY_TABLE;执行成功后,count(*)了一把数据量级,发现确实回到正常水准,于是问题就那么初步解决了。然而如果问题那么容易就解决了,那就不会记录在ATA。上面的SQL留下了一个巨坑,有经验的同学可能一眼就看出来了😭😭😭,如果没有看出来的话,继续下文。
-- 将正常数据复制到临时表CREATE TABLE TEMP_TABLE AS SELECT * FROM MY_TABLE WHERE group <> 'bad_group';赶紧问了下GPT:
- 
不使用drop语句。使用truncate语句,保留原表结构。  
-- 将正常数据复制到临时表CREATE TABLE TEMP_TABLE AS SELECT * FROM MY_TABLE WHERE group <> 'bad_group';
-- 清空原表数据,但不删除表TRUNCATE TABLE MY_TABLE;
-- 将临时表数据插入到原表INSERT INTO MY_TABLE SELECT * FROM TEMP_TABLE;- 使用CREATE TABLE LIKE 语句创建临时表,复制原表结构。
 
-- 创建和原表结构一样的临时表CREATE TABLE TEMP_TABLE LIKE MY_TABLE;
-- 将正常数据复制到临时表INSERT INTO TEMP_TABLE SELECT * FROM MY_TABLE WHERE group <> 'bad_group';
-- 删除原表DROP TABLE MY_TABLE;
-- 将临时表重命名为原表RENAME TABLE TEMP_TABLE TO MY_TABLE;| 
 | 
 | 
 | 
 | 
 | 
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
|
| 
 | 
 | 
 | 
 | 
- 
保留原有数据的同时,将表的主键、唯一键和查询索引进行重建。  - 
将今天新导入的id=0的数据根据原唯一键的规则重新导入。  
-- 1.复制id=0的数据到临时表,CREATE TABLE TEMP_TABLE AS SELECT * FROM MY_TABLE WHERE id = 0;
-- 2.删除源表中id=0的记录DELETE FROM MY_TABLE WHERE id = 0;
-- 3.重建索引ALTER TABLE MY_TABLE ADD INDEX ...;
-- 4.导回id=0的新数据INSERT IGNORE INTO MY_TABLE SELECT * FROM TEMP_TABLE;仔细思考,这次使用CREATE TABLE AS是没有问题的,因为这张临时表并不重要。DELETE由于数据量不大也没有性能问题。出于谨慎,上述4个SQL也是通过4个工单一个个提交执行的,便于中间过程观察。思路清晰,这次应该ok!
[] Duplicate entry '0' for key 'PRIMARY'【解决方法】:https://help.aliyun.com/document_detail/198139.htmlTraceId : 0b8464d617047224212725080d867f百思不得其解,按理想情况,重新导回数据后,id应该是从此刻的最大id开始自增才对(假设表中有10000条数据,那么新插入的数据理应id=10001),为什么还是0,并且还重复了?难道是之前的CREATE TABLE AS语句导致auto increment被清为0了?
ALTER TABLE MY_TABLE AUTO_INCREMENT = 10001;然而仍然报这个错误。
MODIFY COLUMN `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID';至此问题解决。
想了解更多干货,可通过下方扫码关注

详情咨询
可扫码添加上智启元官方客服微信👇

17认证网
	
	
	
	
	
	







