我在一个有几十亿行的SQLite数据库中工作。它是一个只有很少写入的归档数据库。我的主要兴趣是生成数据的集群索引。通过RSQLite接口,我能够生成一个表和标准索引,如下所示。
dbSendStatement(SQLiteConn, "CREATE TABLE VSReports (ReportId bigint Not Null, EvtDateTime text, ConditionCode text, Basis text, ConditionLabel text, VitalSignCode text, VitalSignLbl text, VSUnit text, VSValue text);")
患者报告被提交并输入一次,它将按时间进行多次观察,每次观察将报告条件代码,其命名及其基础,最后每个条件将有一个生命体征,其命名,测量单位和值。 据我所知,每个条目都通过唯一标识 ReportId,EvtDateTime,ConditionCode,Basis,VitalSignCode 另外,我希望将我的数据写为以下群集。 ConditionCode,VitalSignCode,ReportId,EventDateTime,Basis
因为我创建了另一个数据库和表(为磁盘空间约束做这个,可以在同一个数据库中创建表)
dbSendStatement(SQLiteConn2, "CREATE TABLE VSReports (ReportId bigint Not Null, EvtDateTime text, ConditionCode text, Basis text, ConditionLabel text, VitalSignCode text, VitalSignLbl text, VSUnit text, VSValue text, PRIMARY KEY (ConditionCode, VitalSignCode, ReportId, EvtDateTime, Basis));")
我目前正在对数据库运行select查询
dbGetQuery(SQLiteConn, "SELECT *
FROM (SELECT MIN(ROWID) as Keep, MAX(ROWID) as Rmove, COUNT(ROWID) as Fltr
FROM VSReports
GROUP BY ConditionCode, VitalSignCode, ReportId, EventDateTime, Basis) as InnerQ
WHERE Fltr >1
Limit 1;")
到目前为止,这还没有产生任何回报。可能需要一两天才能完成。 但是,当我尝试使用旧主键表填充主键表时,它会立即出错。
dbSendStatement(SQLiteConn2, "ATTACH DATABASE 'C:/Temp/Old.db' as Priordb;"
dbSendStatment(SQLiteConn2, "INSERT INTO VSReports SELECT * FROM Priordb;"
我收到一个UNIQUE CONSTRAINT失败。 但是,如果我将表格修改为
dbSendStatement(SQLiteConn2, "CREATE TABLE VSReports (ReportId bigint Not Null, EvtDateTime text, ConditionCode text, Basis text, ConditionLabel text, VitalSignCode text, VitalSignLbl text, VSUnit text, VSValue text , UnqId as bigint, PRIMARY KEY (ConditionCode, VitalSignCode, ReportId, EvtDateTime, Basis, UnqId ));")
然后
dbSendStatment(SQLiteConn2, "INSERT INTO VSReports SELECT * , ROWID AS UnqId FROM Priordb;")
然后数据传输启动 显然,Priordb中的ROWID带有一个UNIQUE约束 但是,我认为多列PRIMARY KEY的目的是值的组合将生成唯一标识符。
主要目标是磁盘集群分区数据,所以如果我必须在最后添加这个虚拟功能,我会。但是,这至少会导致两个数据表群体。但是,我宁愿不拥有它。
我可以在没有特定UNIQUE元素的情况下编写这个PRIMARY KEY吗?
我可以动态生成这个UNIQUE元素,以便跳过DB的初始填充以获得ROWID吗?