我在一个有几十亿行的 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));")
我目前正在对数据库运行选择查询
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 元素以便跳过数据库的初始填充来获取 ROWID 吗?