下面是一个scores
表:
> PRAGMA TABLE_INFO(SCORES);
0|GROUP_ID|TEXT|0||0
1|GROUP_INDEX|INTEGER|0||0
2|SCORE|REAL|0||0
+----------+-------------+-------+
| GROUP_ID | GROUP_INDEX | SCORE |
+----------+-------------+-------+
| LJ1342 | 1 | 10.3 |
| RX4351 | 2 | 14.7 |
+----------+-------------+-------+
其中每个score
对于(group_id, group_index)
是唯一的。
我现在已经重新计算了分数,并将它们保存到一个csv文件中,如下所示:
(new_scores.csv)
,score
,7
,21
,3
即不存储关于group_id
和group_index
的任何信息。(但我知道CSV中的每一行都与scores
表中的相应记录相匹配,按照我追加它们的顺序。
我现在想用文件中的值更新score
列。但事实证明,这比我想象的要困难,因为没有匹配的指数。(它也是一个大表(80M行),有一些其他长文本列,所以写和擦除需要相当长的时间。)
我尝试导入我的表,为N行添加一个从1到N的自动递增列,然后将其添加到scores
表中,并在此进行连接。
> .mode csv
> .import new_scores.csv
> insert into scores select score from new_scores;
这需要很长的时间来写,并导致一个new_scores
列,这只是空白字符串。
1条答案
按热度按时间t9eec4r01#
如果您没有将其中一个列定义为INTEGER PRIMARY KEY,则Sqlite将在每个表中添加一个隐藏的
ROWID
列。ROWID
是一个自动递增的整数,因此,如果您插入了数据并且从未删除过行,则不应该有任何间隙。您可以通过以下方式进行检查:如果
first = 1
和last = num_records
,则每一行都有一个数字标识符,按照插入行的顺序,没有间隔。您应该对导入的表
new_scores
执行相同的检查,以验证两者具有相同的数字:如果以上是真的,那么你可以用以下命令更新第一个表: