仅插入或替换特定值?

时间:2015-02-07 07:11:42

标签: sql sqlite

我有一张桌子:

    DATE        WEATHERSTATION    TEMPERATURE        RAINFALL
1975-01-10           B81A             25                0
1975-01-11           K174             33                16
1975-01-12           ZG4N             18                3

我通过首先处理包含日期和温度的输入,然后是包含日期和降雨量的输入来构建此表。有时,降雨数据中的日期不会存在于温度数据中(例如,如果气象站开始记录1950年的降雨量,但是1970年的温度会发生 - 它会发生)。

我想做的是说:

  1. 如果此日期已经有一行,则更新值 X (根据程序可能是温度或降雨量);
  2. 如果不是具有此日期的行,请创建它。
  3. 显然,我可以在程序本身内执行此操作,但我认为在SQL中执行此操作会更有效和合理。

    如果我使用INSERT OR REPLACE INTO weatherdata (date, weatherstation, temperature),因为这会删除降雨量值。我喜欢的是INSERT OR UPDATE INTO WEATHERDATA,但这似乎并不存在;我用谷歌搜索了它,并阅读了关于它的StackOverflow帖子,但没有任何东西对我有帮助。

    在这种情况下做什么是正确的?

    (数据库系统是SQLite,如果重要的话。)

1 个答案:

答案 0 :(得分:1)

只有拥有客户端/服务器数据库且希望最大限度地减少网络开销时,在SQL中执行此操作才会更有效。 但SQLite是一个嵌入式数据库,它是一个链接到你的程序的库;将SQL与程序的逻辑混合不会丢失任何东西。

在SQL中执行它是不明智的(它是possible,但是读取和删除旧行然后插入新行的效率会低一些。)

只需在程序中执行逻辑:

db.execute("UPDATE ...")
if db.affected_rows == 0:
    db.execute("INSERT ...")