You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指定长度唯一索引的Title列去重误判疑问及300万+条记录MySQL数据表精准去重方案咨询

你的判断完全正确!

当你给Title列创建长度为256的前缀主键时,InnoDB只会比对每个Title值的前256个字符来判定唯一性。这就导致了一个实际问题:只要两条记录的Title前256字符完全一致,哪怕后面的内容完全不同,INSERT IGNORE都会把它们判定为重复数据,只保留第一条,剩下的直接被忽略——也就是你担心的“误删”情况确实会发生。

针对300万+条记录的精准去重方案

因为数据量很大,操作时得兼顾准确性和性能,我给你整理了一套稳妥的步骤:

第一步:先做全量备份(重中之重!)

不管做什么数据操作,先备份永远是第一位的,避免操作失误导致数据丢失:

-- 创建备份表结构
CREATE TABLE RU_sg1lib_MASTER_backup LIKE RU_sg1lib_MASTER;
-- 同步所有数据到备份表
INSERT INTO RU_sg1lib_MASTER_backup SELECT * FROM RU_sg1lib_MASTER;

第二步:恢复原表的主键结构

先把之前错误设置的Title前缀主键去掉,恢复原来的ID自增主键:

-- 删除前缀主键
ALTER TABLE RU_sg1lib_MASTER DROP PRIMARY KEY;
-- 重新添加ID的自增主键(和原表结构一致)
ALTER TABLE RU_sg1lib_MASTER ADD PRIMARY KEY (ID);

第三步:标记需要保留的唯一记录

我们需要找出完整Title完全相同的重复组,然后每组只保留一条(比如保留ID最小的那条,也就是最早插入的记录):

如果你用的是MySQL 8.0+(支持窗口函数):

-- 创建临时表存储需要保留的记录ID
CREATE TABLE temp_keep_records AS
SELECT ID
FROM (
    SELECT 
        ID,
        -- 按Title分组,给每组记录编号,ID最小的编号为1
        ROW_NUMBER() OVER (PARTITION BY Title ORDER BY ID ASC) AS rn
    FROM RU_sg1lib_MASTER
) t
WHERE rn = 1;

如果是MySQL 5.x版本(不支持窗口函数):

用分组取最小ID的方式:

CREATE TABLE temp_keep_records AS
SELECT MIN(ID) AS ID
FROM RU_sg1lib_MASTER
GROUP BY Title;

第四步:生成去重后的新表并替换原表

直接用DELETE删除300万+数据里的重复项会非常慢,还容易锁表,建议用“创建新表+导入唯一数据+替换原表”的方式:

-- 创建和原表结构一致的新表
CREATE TABLE RU_sg1lib_MASTER_deduplicated LIKE RU_sg1lib_MASTER;
-- 把需要保留的唯一数据导入新表
INSERT INTO RU_sg1lib_MASTER_deduplicated
SELECT m.*
FROM RU_sg1lib_MASTER m
JOIN temp_keep_records k ON m.ID = k.ID;

-- 替换原表(执行前请暂停所有写入操作,避免数据不一致)
RENAME TABLE RU_sg1lib_MASTER TO RU_sg1lib_MASTER_old, RU_sg1lib_MASTER_deduplicated TO RU_sg1lib_MASTER;

替换完成后,你可以检查RU_sg1lib_MASTER_old确认重复数据是否正确删除,没问题的话再删除这个旧表即可。

第五步:添加防重复的索引(可选但推荐)

如果之后要避免再出现Title重复的情况,可以给Title添加全列唯一索引:

ALTER TABLE RU_sg1lib_MASTER ADD UNIQUE INDEX idx_unique_title (Title);

要是担心长字符串索引占用空间太大,也可以用哈希值替代:

-- 新增一个存储Title哈希值的计算列
ALTER TABLE RU_sg1lib_MASTER ADD COLUMN Title_hash CHAR(32) AS (MD5(Title)) STORED;
-- 给哈希列加唯一索引
ALTER TABLE RU_sg1lib_MASTER ADD UNIQUE INDEX idx_unique_title_hash (Title_hash);

哈希索引占用空间小,而且MD5的碰撞概率极低,完全可以满足唯一性校验的需求。

内容的提问来源于stack exchange,提问作者forgodsakehold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:37:40