Sqlite3 更新表信息 , 合并新的 和 老的表。

需求是做一个配置表升级功能。表结构为:key|value新的配置表可能会增加一条条目,或者删除一条条目。(暂时只考虑这种)新表旧表就需要对比下,只存在于旧表中的配置项,则... 需求是做一个配置表升级功能。表结构为:
key | value
新的配置表可能会增加一条条目,或者删除一条条目。(暂时只考虑这种)
新表 旧表 就需要对比下,只存在于旧表中的配置项,则升级之后应该删除之,只存在新表中的配置项,则升级之后应该保留或者添加之。最后生成一张完整的表。
这里不直接覆盖是因为用户的配置可能是有用的,不能随意删除旧表中有用的配置项。

求SQL语句解决此问题。
展开
 我来答
tim_spac
推荐于2016-04-30 · TA获得超过3628个赞
知道大有可为答主
回答量:1804
采纳率:100%
帮助的人:2011万
展开全部
$ sqlite3 
SQLite version 3.7.7 2011-06-23 19:49:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table tb_config (key, value);
sqlite> create table tb_update (key, value);
sqlite> create table tb_history (key, value_old, value_new, updatetime);
sqlite> 
sqlite> insert into tb_config values (1, 'config');
sqlite> insert into tb_config values (2, 'ELL');
sqlite> insert into tb_config values (3, 'G-Net');
sqlite> select * from tb_config;
1|config
2|ELL
3|G-Net
sqlite> 
sqlite> insert into tb_update values (2, 'ELL');
sqlite> insert into tb_update values (3, 'G-Net BoSS');
sqlite> insert into tb_update values (4, 'test');
sqlite> select * from tb_update;
2|ELL
3|G-Net BoSS
4|test
sqlite> 
sqlite> -- 移除删除的条目
sqlite> insert into tb_history
   ...> select a.key
   ...>     , a.value as value_old
   ...>     , NULL as value_new
   ...>     , datetime('now') as updatetime 
   ...> from tb_config a
   ...> left join tb_update b on a.key = b.key
   ...> where b.key is null;
sqlite> 
sqlite> delete from tb_config
   ...> where not exists (select 1
   ...>     from tb_update
   ...>     where tb_config.key = tb_update.key);
sqlite> 
sqlite> -- 新添加的条目
sqlite> insert into tb_config
   ...> select tb_update.*
   ...> from tb_update
   ...> left join tb_config on  tb_config.key = tb_update.key
   ...> where tb_config.key is null;
sqlite> 
sqlite> -- 更新的条目
sqlite> insert into tb_history
   ...> select a.key
   ...>     , a.value as value_old
   ...>     , b.value as value_new
   ...>     , datetime('now') as updatetime
   ...> from tb_config a
   ...> join tb_update b on  b.key = a.key
   ...> where b.value != a.value;
sqlite> 
sqlite> update tb_config set value = (
   ...>     select tb_update.value
   ...>     from tb_update 
   ...>     where tb_update.key = tb_config.key
   ...>     and tb_config.value != tb_update.value
   ...>     );
sqlite> 
sqlite> select * from tb_config;
2|
3|G-Net BoSS
4|
sqlite> select * from tb_update;
2|ELL
3|G-Net BoSS
4|test
sqlite> select * from tb_history;
1|config||2013-10-12 03:41:43
3|G-Net|G-Net BoSS|2013-10-12 03:41:43
sqlite> .q
$
AiPPT
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图... 点击进入详情页
本回答由AiPPT提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式