如何在不重复的情况下插入mysql并且不能更改表列的唯一性



我想在一个名为t_phone_numbers的5亿表中插入500万个数据,但没有重复的电话,所以我选择了所有现有的电话并在内存中进行比较,但我得到了Out Of Memory错误,因为MySQL表的数据量很大
我该如何解决?

限制:Mysql表t_phone_numbers不能更改,列phone_number不是唯一的。创建一个新表是可以接受的。

作为一个例子。

CREATE TABLE existing (phone VARCHAR(255))
SELECT '123456789' phone UNION ALL
SELECT '789456123' UNION ALL
SELECT '456456456' UNION ALL
SELECT '654654645' UNION ALL
SELECT '123321123' ;
SELECT * FROM existing;
|手机||:--------||123456789||789456123||456456456||654654645||123321123 |
<blockquote\
CREATE TABLE new (phone VARCHAR(255) UNIQUE)
SELECT '123456789' phone UNION ALL
SELECT '464646464' UNION ALL
SELECT '123321123' ;
SELECT * FROM new;
>
|手机||:--------||123321123||123456789||464646464|
<blockquote\
INSERT 
INTO existing (phone)
SELECT phone
FROM new
WHERE NOT EXISTS ( SELECT NULL
FROM existing
WHERE new.phone = existing.phone );
SELECT * FROM existing;
>
|手机||:--------||123456789||789456123||456456456||654654645||123321123||464646464|

db<gt;小提琴这里


最大的问题是INSERT中的SELECT部分。如果现有表和新表的phone列都没有索引,则该过程可能是无限的。。

因此,建议在新表中对该列进行索引,并(如果可能的话(在现有表中进行索引。甚至可以创建一个现有表的副本(仅限电话列(,对其进行索引并在SELECT部分中使用。

在任何情况下,这种SELECT优化都是最大的问题(索引、使用LEFT JOIN等(,插入本身将相对较快。

最新更新