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

Java 如何在不重复的情况下插入mysql,并且不能更改表列的唯一性?,java,mysql,Java,Mysql,我想在一个名为t\u phone\u numbers的5亿个表中插入500万个数据,但没有重复的电话,因此我选择了exist phones all并在内存中对它们进行比较,但我的内存不足错误,因为MySQL表有大量数据。 我怎样才能解决它 限制:Mysql表t\u phone\u numbers不能更改,列phone\u numbers不是唯一的。创建新表是可以接受的。例如 |电话| | :-------- | | 123456789 | | 789456123 | | 456456456 |

我想在一个名为
t\u phone\u numbers
的5亿个表中插入500万个数据,但没有重复的电话,因此我选择了exist phones all并在内存中对它们进行比较,但我的
内存不足
错误,因为MySQL表有大量数据。
我怎样才能解决它

限制:Mysql表
t\u phone\u numbers
不能更改,列phone\u numbers不是唯一的。创建新表是可以接受的。

例如

|电话| | :-------- | | 123456789 | | 789456123 | | 456456456 | | 654654645 | | 123321123 | | 464646464 | 小提琴


最大的问题是在“插入”中选择零件。如果既没有对现有表的
phone
列进行索引,也没有对新表的
列进行索引,则该过程可能是无限的

因此,建议在新表和(如果可能的话)现有表中为该列编制索引。甚至可以创建现有表的副本(仅限于电话列),为其编制索引并在选择部分中使用


无论如何,这种选择优化是最大的问题(索引、使用左连接等),插入本身将相对较快。

因此我选择exist phones all并在内存中比较它们??只需查询电话。如果存在,则至少返回一行,否则不返回。请将您的查询代码作为文本与表定义一起添加到问题中。我要插入500万个电话,如果我选择mysql中的每个存在电话,则需要500万次查询@类似的,因为这不是diff算术问题,
内存不足
错误是主要问题。。。所以我想找一些其他的方法来解决这个问题,而不是读入记忆@因此,上述方法似乎是适用的。
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;
| phone | | :-------- | | 123456789 | | 789456123 | | 456456456 | | 654654645 | | 123321123 |
CREATE TABLE new (phone VARCHAR(255) UNIQUE)
SELECT '123456789' phone UNION ALL
SELECT '464646464' UNION ALL
SELECT '123321123' ;
SELECT * FROM new;
| phone | | :-------- | | 123321123 | | 123456789 | | 464646464 |
INSERT 
INTO existing (phone)
SELECT phone
FROM new
WHERE NOT EXISTS ( SELECT NULL
                   FROM existing
                   WHERE new.phone = existing.phone );
SELECT * FROM existing;
| phone | | :-------- | | 123456789 | | 789456123 | | 456456456 | | 654654645 | | 123321123 | | 464646464 |