含唯一字段的300万级数据表批量增量插入方案咨询
当然可以实现!针对你的场景,有高效的批量解决方案
首先要确认的核心前提:你的c_document字段必须已经设置了唯一约束(UNIQUE KEY)——这是数据库能自动判断“记录是否存在”的基础,要是还没加,先执行这条SQL(以MySQL为例,其他数据库语法类似):
ALTER TABLE your_existing_table ADD UNIQUE KEY idx_unique_document (c_document);
下面针对主流数据库给出具体的批量操作方案,完全支持处理500MB级别的数据,而且不会删除现有记录:
MySQL/MariaDB 方案
最简洁的方式是用INSERT IGNORE,它会自动跳过违反唯一约束的记录(也就是已存在的c_document):
如果更新数据在临时表(比如new_records)里
INSERT IGNORE INTO your_existing_table (c_id, c_laname, c_mname, c_fname, c_document, c_email, c_dob) SELECT c_id, c_laname, c_mname, c_fname, c_document, c_email, c_dob FROM new_records;
如果是直接导入500MB的SQL文件
你可以打开SQL文件,把所有INSERT INTO替换成INSERT IGNORE INTO,然后用MySQL命令行工具导入(比GUI稳定):
mysql -u your_username -p your_database < your_update_file.sql
PostgreSQL 方案
PostgreSQL提供了专门的冲突处理语法ON CONFLICT DO NOTHING,逻辑清晰且高效:
INSERT INTO your_existing_table (c_id, c_laname, c_mname, c_fname, c_document, c_email, c_dob) SELECT c_id, c_laname, c_mname, c_fname, c_document, c_email, c_dob FROM new_records ON CONFLICT (c_document) DO NOTHING;
如果是导入SQL文件,同样可以把单条INSERT改成批量形式,或者用psql命令行导入,记得加事务提升速度。
SQL Server 方案
可以用MERGE语句,或者更直观的INSERT + NOT EXISTS:
方式1:MERGE(推荐,逻辑更清晰)
MERGE INTO your_existing_table AS target USING (SELECT c_id, c_laname, c_mname, c_fname, c_document, c_email, c_dob FROM new_records) AS source ON target.c_document = source.c_document WHEN NOT MATCHED THEN INSERT (c_id, c_laname, c_mname, c_fname, c_document, c_email, c_dob) VALUES (source.c_id, source.c_laname, source.c_mname, source.c_fname, source.c_document, source.c_email, source.c_dob);
方式2:INSERT + NOT EXISTS
INSERT INTO your_existing_table (c_id, c_laname, c_mname, c_fname, c_document, c_email, c_dob) SELECT c_id, c_laname, c_mname, c_fname, c_document, c_email, c_dob FROM new_records AS source WHERE NOT EXISTS ( SELECT 1 FROM your_existing_table AS target WHERE target.c_document = source.c_document );
通用优化建议(针对大文件导入)
- 用命令行工具导入:别用GUI工具,
mysql、psql、sqlcmd这些原生工具处理大文件更稳定,速度也更快 - 批量插入+事务:把SQL文件里的单条INSERT合并成批量(比如一次插1000条),并且用事务包裹整个导入操作,减少磁盘IO开销
- 临时禁用非唯一索引:导入前先禁用表上的非唯一索引,导入完成后再重建,能大幅提升导入速度
- 优先用批量加载工具:如果更新数据是CSV/TSV格式,别用SQL插入,用
LOAD DATA(MySQL)、COPY(PostgreSQL)、BULK INSERT(SQL Server),速度能快几倍甚至几十倍
最后提醒:先在测试环境用小批量数据验证逻辑,确认不会误改现有数据后,再在生产环境执行哦!
内容的提问来源于stack exchange,提问作者COINFEUROPEA
相关产品推荐
相关产品推荐

