【问题标题】:Insert an R data.frame into a mysql table in the mysql REPLACE fashion以 mysql REPLACE 方式将 R data.frame 插入到 mysql 表中
【发布时间】:2014-05-24 22:42:14
【问题描述】:

(对不起,如果这是非常基本的,我只是无法弄清楚)

我在 mysql 数据库中有一个表 t,它看起来像这样:(名称是主键)

数据库中的当前表

Name   Balance
 Bob      100
 Ted      150
 Carl     130

我在 R 中也有一个 data.frame 反映余额变化

R 中的 data.frame

Name   Balance
 Bob      90
 Ted      170
 Bill     50

我想执行相当于 mysql replace 的操作,以便更新我的表以反映新余额

数据库中的所需表

Name   Balance
 Bob      90
 Ted      170
 Carl     130
 Bill     50

我目前正在使用 RMySQL 包 - 我尝试使用 dbWriteTable 执行此操作,但无法使其正常工作。

Eg1(“插入”)

dbWriteTable(dbConnection, 'tableName', df, row.names=F, append=T)

生产

Name   Balance
 Bob      100
 Ted      150
 Carl     130
 Bill     50

Eg2(“覆盖”)

dbWriteTable(dbConnection, 'tableName', df, row.names=F, append=F, overwrite=T)

生产

Name   Balance
 Bob      90
 Ted      170
 Bill     50

如何进行替换?

【问题讨论】:

  • 你应该分享你尝试过的东西并解释它是如何不起作用的。不过,我不确定您为什么要使用dbWriteTable。您是否只需编写一个特定的替换查询并像其他任何selectdeleteinsert 查询一样发送它?
  • 按照建议添加了对我的尝试的更多解释。替换查询会是什么样子?注意-我的数据框和 mySQL 表都很大,因此它可能需要是“批量”的替换

标签: mysql r rmysql


【解决方案1】:

如果它非常基本,那么我建议使用基本的 SQL 查询。我总是使用 packacke RODBC 连接到 MySQL 数据库。这是我的例子。 'conn' 是与您的数据库的连接:

library("RODBC")

df <- data.frame(Name = c('Bob', 'Ted', 'Bill'), Balance = c(90, 170, 50))

for (i in 1:nrow(df)) {
  query <- paste0("REPLACE tablename values ('", paste(df[i, ], collapse = "', '"), "')")
  sqlQuery(conn, query)
}

您可以随意修改查询。上面的代码要求 MySQL 中的表与数据帧具有相同的列。当您使用较大的数据帧时,我建议使用“加载数据(本地)INFILE”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多