如何高效将文本文件数据追加到SQLite表(仅新增无重复数据)
高效追加数据到SQLite表的方案
你的DataAdapter方案是可行的,但并非最高效的选择。针对你的需求(仅插入不存在的Date/Value对),推荐两种更高效的方案:
方案一:利用INSERT OR IGNORE结合批量操作
因为你的Date列有唯一性约束,SQLite的INSERT OR IGNORE语句会自动跳过违反唯一约束的行(也就是已存在的日期),无需逐行检查。
命令行工具实现(适合快速处理)
- 打开SQLite命令行,连接到目标数据库:
sqlite3 your_database.db - 设置文本文件的字段分隔符为制表符:
.mode tabs - 导入数据到临时表,再通过
INSERT OR IGNORE追加到目标表:.import your_data.txt temp_import INSERT OR IGNORE INTO myTable(Date, Value) SELECT Date, Value FROM temp_import; DROP TABLE temp_import;
编程实现(以C#为例)
如果用代码处理,可先将文本文件加载到内存,再通过参数化批量插入+事务提升效率:
using System.Data.SQLite; using System.IO; // 读取文本文件内容(跳过表头如果有) var lines = File.ReadAllLines("your_data.txt").Skip(1); using var conn = new SQLiteConnection("Data Source=your_database.db;"); conn.Open(); using var transaction = conn.BeginTransaction(); // 事务能大幅提升批量插入速度 var cmd = new SQLiteCommand("INSERT OR IGNORE INTO myTable(Date, Value) VALUES (@Date, @Value)", conn, transaction); var dateParam = cmd.Parameters.Add("@Date", DbType.String); var valueParam = cmd.Parameters.Add("@Value", DbType.Double); // 根据实际数据类型调整 foreach (var line in lines) { var parts = line.Split('\t'); dateParam.Value = parts[0]; valueParam.Value = parts[1]; cmd.ExecuteNonQuery(); } transaction.Commit();
方案二:临时表+批量比对插入
如果文本文件数据量极大(比如百万级行),先导入临时表再批量比对插入的效率会更高:
- 创建与目标表结构匹配的临时表:
CREATE TEMP TABLE temp_data(Date TEXT UNIQUE, Value REAL); -- 字段类型需和myTable保持一致 - 导入文本文件到临时表:
.mode tabs .import your_data.txt temp_data - 插入目标表中不存在的记录:
INSERT INTO myTable(Date, Value) SELECT t.Date, t.Value FROM temp_data t WHERE NOT EXISTS (SELECT 1 FROM myTable m WHERE m.Date = t.Date); - 清理临时表:
DROP TABLE temp_data;
关于你提到的DataAdapter方案
这个方案确实可行,但默认情况下DataAdapter是逐行执行更新操作,即使开启批量更新,效率也不如直接利用SQLite内置的INSERT OR IGNORE或临时表比对。如果你的数据量不大,用DataAdapter也能满足需求,但数据量较大时,推荐上面两种方案。
内容的提问来源于stack exchange,提问作者GreenBear
相关产品推荐
相关产品推荐

