【问题标题】:How to update MySQL table using RMySQL package如何使用 RMySQL 包更新 MySQL 表
【发布时间】:2018-08-23 22:35:01
【问题描述】:

除了将整个表追加或覆盖到数据库之外,RMySQL 中是否有任何函数可以只更新表的一部分?因为有一天我们的一些数据可能不完整,我需要保留旧表并只替换有新数据进入的行,这是我编写的函数,但没有工作,任何帮助将不胜感激:

col.info <- "(id int, timestamp bigint, yyyy int, mm int, dd int, value double, 
PRIMARY KEY(id, timestamp, yyyy, mm, dd))"

Func <- function(con, tbl.name, dat.set, col.info) {
  if (dbExistsTable(con, tbl.name)) {  
  dbWriteTable(con, tbl.name, dat.set, row.names=F, append=T);  #what can I change the append for??

  } else { 
  dbSendQuery(con, paste("CREATE TABLE IF NOT EXISTS", tbl.name, col.info, sep=" ")); 
  dbWriteTable(con, tbl.name, dat.set, row.names=F, append=T);
  }
} 

Func(conn_table, "daily_update", df, col.info)

【问题讨论】:

  • 您可以使用 dbSendQuery。你说它不起作用,但是如何?你得到什么消息?其次,我会将该函数称为 dailyUpdate 而不是 Func。
  • 我刚刚再次运行了代码,这次成功了!!但是上次整个表都重​​复了,我是数据库新手,所以如果主键在那里,表不应该有重复的行,对吗?谢谢。
  • 是的!主键在数据行中是唯一的。
  • 谢谢@agstudy,明天我会运行数据,希望一切顺利,不胜感激。
  • 上次我只是运行上面的代码,但是当我运行整个代码时,整个表又重复了,我发现问题是时间戳,每次都会生成一个新的数字,因此,行变得不同,我试图删除主键中的时间戳,但似乎没有帮助

标签: r rmysql


【解决方案1】:

我最近遇到了 dbx package,它可以满足您的需求。

以下代码将对您的数据库表执行 upsert(重复键更新)查询。只需将 where_cols 参数替换为作为主键的列即可。

install.packages("dbx")
library(dbx)
dbx::dbxUpsert(con, tbl.name, dat.set, where_cols = c("id"))

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 感谢@mmgross 的提示,我已经相应地调整了我的答案。
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2013-12-03
  • 2014-02-17
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多