我目前正在使用分布式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中使用UPDATEs上的连接是不可能的。
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
我已经阅读了几个SO问题,但我只能找到只需要更新一行或知道身份的地方的解决方案。
DB-结构
server_db:
演示文稿( id:pk,label,changedate )
clients_uploaded_db:
演示文稿( id:pk,label,changedate )
TL; DR
我无法在UPDATE上连接表,但是我需要使表的行与我的查询中可用的另一个数据库上的表上的行完全相同,但仅限于{{1}第二个数据库的col高于第一个数据库的col。
到目前为止我做了什么
答案 0 :(得分:1)
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);