sqlite 从没有匹配列的文件向表中添加列

hfsqlsce  于 2023-05-18  发布在  SQLite
关注(0)|答案(1)|浏览(145)

下面是一个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_idgroup_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列,这只是空白字符串。

t9eec4r0

t9eec4r01#

如果您没有将其中一个列定义为INTEGER PRIMARY KEY,则Sqlite将在每个表中添加一个隐藏的ROWID列。ROWID是一个自动递增的整数,因此,如果您插入了数据并且从未删除过行,则不应该有任何间隙。您可以通过以下方式进行检查:

SELECT count(*) as num_records, min(rowid) as first, max(rowid) as last 
FROM scores;

如果first = 1last = num_records,则每一行都有一个数字标识符,按照插入行的顺序,没有间隔。
您应该对导入的表new_scores执行相同的检查,以验证两者具有相同的数字:

SELECT count(*) as num_records, min(rowid) as first, max(rowid) as last 
FROM new_scores;

如果以上是真的,那么你可以用以下命令更新第一个表:

UPDATE scores
SET score = new_scores.score
FROM new_scores
WHERE score.rowid = new_scores.rowid;

相关问题