【问题标题】:RMYSQL- Insert Ignore, Replace -RRMYSQL-插入忽略,替换-R
【发布时间】:2014-10-29 07:33:45
【问题描述】:

我正在使用 RMySQL 包从 R 将数据导出到 MySQL 数据库。我面临的一个大问题是重复:我有太多具有相同值的条目。系统自动生成结果并将数据框插入数据库。

数据库中的当前表:

Name   Balance  
Bob      100
Ted      150
Carl     130

我在 R 中还有一个数据框 (df),反映了余额的变化:

> df
    Name   Balance
[1] Bob      100
[2] Ted      150
[3] Bill     50

要插入数据库的数据:

Name   Balance
Bill     50

现在插入后,表格应如下所示:

Name   Balance
 Bob      100
 Ted      100
 Carl     130
 Bill     50

但是我的 dbwrite 产生了这个:

Name   Balance
 Bob      100
 Ted      100
 Carl     130
 Bob      100
 Ted      150
 Bill     50

我正在使用此代码:

dbWriteTable(con, "DB Table name", rbind(Dataframe), row.names=FALSE,append=TRUE)

有什么方法可以检查现有的,并使用 R 中的 RMYSQL 只用新的更新表。

【问题讨论】:

  • 你的mysql表有索引吗?具体来说,是否有一个唯一索引可以让您执行insert ... on duplicate key ...
  • 如何将现有行从DB读取到dataframe,与新数据比较,只有dbWriteTable有区别?
  • @zx8754 是的,我也想过,但是桌子一天比一天大。将其读入 R 将花费更多时间。
  • @Barranka 是的,它有唯一的索引。但我认为 RMySQL 包中没有 insert ON DUPLICATE key 选项。
  • 如果有UNIQUE索引,那为什么要插入表中的数据呢?它应该返回一个错误。

标签: r rmysql


【解决方案1】:

不要使用dbWriteTable(),而是使用dbSendQuery()。您可以构建一个 SQL 查询来插入数据框的每一行:

df <- data.frame(name=c('Bob','Ted','Bill'), balance=c(100,150,50))
strSQL <- paste(
  'insert into your_table (name, balance) values',
  paste(sprintf("('%s', %f)", df$name, df$balance), collapse=', '),
  'on duplicate key update balance = values(balance)',
  sep = ' '
)
# The query will be something like this:
#           insert into your_table (name, balance)
#           values ('Bob', 100.000000), ('Ted', 150.000000), ('Bill', 50.000000) 
#           on duplicate key update balance = values(balance);
# Important: If you want this to work, you must ensure that there's a unique
# index on column 'name' in your_table
dbSendQuery(con, strSQL)

【讨论】:

  • 感谢您的回复。我尝试了您的查询,但出现错误。 mysqlExecStatement(conn, statement, ...) 中的错误:RS-DBI 驱动程序:(无法运行语句:您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册以获取正确的语法以在附近使用'' 在第 1 行)
  • @AishwaryaaViswanathan 对不起!错过了 SQL 语句的最后一部分:on duplicate key update balance = values(balance)。我刚刚用更正编辑了答案。现在应该可以工作了
  • 最好使用 dbGetQuery,因为它会自动关闭结果集。您还应该引用值或使用参数化查询以防止 SQL 注入攻击
  • @hadley 您能否发布一个链接或参考,说明如何将准备好的语句与RMySQL 一起使用?我没有找到任何关于它的信息(我已经搜索过)
  • 它主要是在开发版本中 - github.com/rstats-db/RMySQL。很快就会编写概述文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多