我目前正在使用分布式sqlite数据库。
每个客户机都有自己的数据库,可以与服务器数据库同步。
服务器从客户端接收数据库,并根据客户端发送的数据库更新和插入自己的行。
插入新记录的过程非常简单:
ATTACH DATABASE 'clients_uploaded_db' AS toMerge;
INSERT INTO `presentation` SELECT * FROM toMerge.presentation WHERE id NOT IN (
SELECT id FROM `presentation`
)
更新不是。我需要检查客户机记录是否已更改(
presentation.changedate
的值小于客户机数据库中的presentation.changedate
),并在必要时进行更新。在诸如mysql这样的dbms中,可能会出现以下情况。但是在sqlite中对更新使用连接是不可能的。
ATTACH DATABASE 'clients_uploaded_db' AS toMerge;
UPDATE presentation
INNER JOIN toMerge.presentation AS tp ON
id = tp.id
SET
label = tp.label
WHERE
tp.changedate > changedate
我已经阅读了几个这样的问题,但我只能找到解决方案,其中只有一行需要更新或在哪里的ID是已知的。
数据库结构
服务器数据库:
演示文稿(id:pk、label、changedate)
客户端上载数据库:
演示文稿(id:pk、label、changedate)
TL;博士
我不能在更新时联接表,但我需要使表的行与查询中可用的另一个数据库上的表的行完全相同,但仅当第二个数据库的
changedate
列高于第一个数据库的列时。到目前为止我所做的
试图加入相关表
以编程方式遍历记录,并在必要时进行更新(工作正常,但会影响性能)
最佳答案
sqlite不支持from
子句。所以您必须对相关的子查询执行此操作。不清楚你的更新应该做什么。但这里有一个例子
UPDATE presentation
SET label = (select tp.label
from toMerge.presentation tp
where presentation.id = tp.id and
tp.changedate > presentation.changedate
order by tp.change_date
limit 1);