仅插入或替换特定值?
INSERT OR REPLACE only specific values?
我有一个 table:
DATE WEATHERSTATION TEMPERATURE RAINFALL
1975-01-10 B81A 25 0
1975-01-11 K174 33 16
1975-01-12 ZG4N 18 3
我通过首先处理包含日期和温度的输入,然后处理包含日期和降雨量的输入来构建此 table。有时,降雨数据中的某些日期在温度数据中不存在(例如,如果气象站开始记录 1950 年的降雨量但 1970 年的温度 - 它发生了)。
我想说的是:
- 如果这个日期已经有一行,更新值X(可以是温度或降雨量,具体取决于程序);
- 如果没有包含此日期的行,请创建它。
显然,我可以在程序本身中执行此操作,但我认为在 SQL 中执行此操作会更有效、更明智。
如果我使用 INSERT OR REPLACE INTO weatherdata (date, weatherstation, temperature)
,因为那样会删除降雨量值。我想要的是 INSERT OR UPDATE INTO WEATHERDATA
,但似乎不存在;我用 Google 搜索过它,并阅读了有关它的 Whosebug 帖子,但没有任何帮助。
在这种情况下,正确的做法是什么?
(数据库系统是 SQLite,如果重要的话。)
只有在您拥有 client/server 数据库并希望将网络开销降至最低的情况下,在 SQL 中执行此操作才会更有效率。
但是 SQLite 是一个嵌入式数据库,它是一个链接到您的程序中的库;将 SQL 与您的程序逻辑混合不会丢失任何内容。
在 SQL 中这样做是不明智的(它是 possible,但读取和删除旧行然后插入新行的效率较低)。
只需执行您程序中的逻辑即可:
db.execute("UPDATE ...")
if db.affected_rows == 0:
db.execute("INSERT ...")
我有一个 table:
DATE WEATHERSTATION TEMPERATURE RAINFALL
1975-01-10 B81A 25 0
1975-01-11 K174 33 16
1975-01-12 ZG4N 18 3
我通过首先处理包含日期和温度的输入,然后处理包含日期和降雨量的输入来构建此 table。有时,降雨数据中的某些日期在温度数据中不存在(例如,如果气象站开始记录 1950 年的降雨量但 1970 年的温度 - 它发生了)。
我想说的是:
- 如果这个日期已经有一行,更新值X(可以是温度或降雨量,具体取决于程序);
- 如果没有包含此日期的行,请创建它。
显然,我可以在程序本身中执行此操作,但我认为在 SQL 中执行此操作会更有效、更明智。
如果我使用 INSERT OR REPLACE INTO weatherdata (date, weatherstation, temperature)
,因为那样会删除降雨量值。我想要的是 INSERT OR UPDATE INTO WEATHERDATA
,但似乎不存在;我用 Google 搜索过它,并阅读了有关它的 Whosebug 帖子,但没有任何帮助。
在这种情况下,正确的做法是什么?
(数据库系统是 SQLite,如果重要的话。)
只有在您拥有 client/server 数据库并希望将网络开销降至最低的情况下,在 SQL 中执行此操作才会更有效率。 但是 SQLite 是一个嵌入式数据库,它是一个链接到您的程序中的库;将 SQL 与您的程序逻辑混合不会丢失任何内容。
在 SQL 中这样做是不明智的(它是 possible,但读取和删除旧行然后插入新行的效率较低)。
只需执行您程序中的逻辑即可:
db.execute("UPDATE ...")
if db.affected_rows == 0:
db.execute("INSERT ...")