SQL:如何删除和更新 table 中的记录,与 (Q)List 数据同步以减轻 database/table 的负担?
SQL: How to remove & update records in a table, sync'ing with a (Q)List data in order to decrease the burden on database/table?
我在 Windows7 OS.
上使用 Qt 和 MS-Sql 服务器
我有一个 MS-SQL 数据库,我用它来存储 data/info 来自安装在某些车辆上的设备。
在名为 TransactionFilesInfo
的数据库中有一个 table - 当设备连接到 TCP 服务器时,一个 table 用于存储有关设备交易文件的信息。
我们使用此 table 是因为我们被要求避免 重复 文件。当远程设备在将交易文件发送到服务器后不删除交易文件时,(有时)会发生这种情况。因此,我使用 table 中的信息来检查 [size and CRC]
以避免下载 重复项 。
TransactionFilesInfo
table 的一些示例数据如下所示:
[TransactionFilesInfo]:
DeviceID FileNo FileSequence FileSize FileCRC RecordTimeStamp
10203 2 33 230 55384 2015-11-26 14:54:15
10203 7 33 624 55391 2015-11-26 14:54:15
10203 2 34 146 21505 2015-11-26 14:54:16
10203 7 34 312 35269 2015-11-26 14:54:16
10203 2 35 206 23022 2015-11-26 15:33:22
10203 7 35 208 11091 2015-11-26 15:33:22
10203 2 36 134 34918 2015-11-26 15:55:44
10203 7 36 104 63865 2015-11-26 15:55:44
10203 2 37 140 35466 2015-11-26 16:20:38
10203 7 37 208 62907 2015-11-26 16:20:38
10203 2 38 134 17706 2015-11-26 16:38:33
10203 7 38 104 42358 2015-11-26 16:38:33
11511 2 21 194 29913 2015-12-02 16:22:59
11511 7 21 114 30038 2015-12-02 16:22:59
另一方面,每次设备连接到服务器时,它首先发送文件信息列表。 Qt 应用程序会处理这个问题。
该列表包含这样的元素:
struct FileInfo
{
unsigned short FileNumber;
unsigned short FileSequence;
unsigned short FileCRC;
unsigned long FileSize;
};
因此,作为 示例(受上述 table 启发)连接的设备 (DeviceID=10203
) 可能会说它具有以下文件:
QList<FileInfo> filesList;
// here is the log4qt output...
filesList[0] --> FileNo=2 FileSeq=33 FileSize=230 and FileCRC=55384
filesList[1] --> FileNo=2 FileSeq=34 FileSize=146 and FileCRC=21505
filesList[2] --> FileNo=7 FileSeq=33 FileSize=624 and FileCRC=55391
filesList[3] --> FileNo=7 FileSeq=34 FileSize=312 and FileCRC=35269 ...
好吧,我需要的是一种方法remove/delete,对于给定的DeviceID
,TransactionFilesInfo
table中的所有记录,不在table中的记录远程设备发送的列表。因此,我将能够减轻数据库的负担(大小)table。
备注:目前我只是删除(@midnight)所有超过10天的记录,基于RecordTimeStamp
字段。因此,table 的大小不会增加到令人担忧的水平:)
最后,稍微澄清一下:我主要需要 SQL 方面的帮助。然而,我不会拒绝关于如何在 Qt 方面做一些相关的 things/tricks 的任何想法 ;)
删除这些记录的 SQL 可能看起来像这样:
DELETE FROM [SAMPLE DATA]
WHERE DeviceID = 10203
and 'File' + CONVERT(varchar(11),FileNo) + '_' +
RIGHT('000' + CONVERT(varchar(11),FileSequence),3)
NOT IN ('File2_033','File2_034','File7_033','File7_034',...)
如果你想为一个设备删除所有这些,你可以删除查看 FileNo 和 FileSequence 的代码,所以它很简单:
DELETE FROM [SAMPLE DATA]
WHERE DeviceID = 10203
我在 Windows7 OS.
上使用 Qt 和 MS-Sql 服务器
我有一个 MS-SQL 数据库,我用它来存储 data/info 来自安装在某些车辆上的设备。
在名为 TransactionFilesInfo
的数据库中有一个 table - 当设备连接到 TCP 服务器时,一个 table 用于存储有关设备交易文件的信息。
我们使用此 table 是因为我们被要求避免 重复 文件。当远程设备在将交易文件发送到服务器后不删除交易文件时,(有时)会发生这种情况。因此,我使用 table 中的信息来检查 [size and CRC]
以避免下载 重复项 。
TransactionFilesInfo
table 的一些示例数据如下所示:
[TransactionFilesInfo]:
DeviceID FileNo FileSequence FileSize FileCRC RecordTimeStamp
10203 2 33 230 55384 2015-11-26 14:54:15
10203 7 33 624 55391 2015-11-26 14:54:15
10203 2 34 146 21505 2015-11-26 14:54:16
10203 7 34 312 35269 2015-11-26 14:54:16
10203 2 35 206 23022 2015-11-26 15:33:22
10203 7 35 208 11091 2015-11-26 15:33:22
10203 2 36 134 34918 2015-11-26 15:55:44
10203 7 36 104 63865 2015-11-26 15:55:44
10203 2 37 140 35466 2015-11-26 16:20:38
10203 7 37 208 62907 2015-11-26 16:20:38
10203 2 38 134 17706 2015-11-26 16:38:33
10203 7 38 104 42358 2015-11-26 16:38:33
11511 2 21 194 29913 2015-12-02 16:22:59
11511 7 21 114 30038 2015-12-02 16:22:59
另一方面,每次设备连接到服务器时,它首先发送文件信息列表。 Qt 应用程序会处理这个问题。
该列表包含这样的元素:
struct FileInfo
{
unsigned short FileNumber;
unsigned short FileSequence;
unsigned short FileCRC;
unsigned long FileSize;
};
因此,作为 示例(受上述 table 启发)连接的设备 (DeviceID=10203
) 可能会说它具有以下文件:
QList<FileInfo> filesList;
// here is the log4qt output...
filesList[0] --> FileNo=2 FileSeq=33 FileSize=230 and FileCRC=55384
filesList[1] --> FileNo=2 FileSeq=34 FileSize=146 and FileCRC=21505
filesList[2] --> FileNo=7 FileSeq=33 FileSize=624 and FileCRC=55391
filesList[3] --> FileNo=7 FileSeq=34 FileSize=312 and FileCRC=35269 ...
好吧,我需要的是一种方法remove/delete,对于给定的DeviceID
,TransactionFilesInfo
table中的所有记录,不在table中的记录远程设备发送的列表。因此,我将能够减轻数据库的负担(大小)table。
备注:目前我只是删除(@midnight)所有超过10天的记录,基于RecordTimeStamp
字段。因此,table 的大小不会增加到令人担忧的水平:)
最后,稍微澄清一下:我主要需要 SQL 方面的帮助。然而,我不会拒绝关于如何在 Qt 方面做一些相关的 things/tricks 的任何想法 ;)
删除这些记录的 SQL 可能看起来像这样:
DELETE FROM [SAMPLE DATA]
WHERE DeviceID = 10203
and 'File' + CONVERT(varchar(11),FileNo) + '_' +
RIGHT('000' + CONVERT(varchar(11),FileSequence),3)
NOT IN ('File2_033','File2_034','File7_033','File7_034',...)
如果你想为一个设备删除所有这些,你可以删除查看 FileNo 和 FileSequence 的代码,所以它很简单:
DELETE FROM [SAMPLE DATA]
WHERE DeviceID = 10203