【问题标题】:R: Why does dbWriteTable fail when table exists despite 'append = TRUE'R:尽管'append = TRUE',为什么表存在时dbWriteTable会失败
【发布时间】:2019-11-29 17:43:00
【问题描述】:

我正在尝试使用dbWriteTable 方法将新数据附加到已经存在的 MySQL 表中。我过去使用它没有问题,但是现在它失败了,因为表已经存在。尽管使用了overwrite=FALSE, append=TRUE,

代码:

full_sum_table <- 'mydb.summary'    
dbWriteTable(conn=open_connection, name=full_sum_table, value=summary_data_final, overwrite=FALSE, append=TRUE, row.names=0)

Error in mysqlExecStatement(conn, statement, ...) : 
   RS-DBI driver: (could not run statement: Table 'summary' already exists)
[1] FALSE
Warning message:
In mysqlWriteTable(conn, name, value, ...) :
  could not create table: aborting mysqlWriteTable

此代码的第一次调用工作正常,但后续调用失败。

任何想法将不胜感激。谢谢

环境:

  R version 3.0.2
  Packages: DBI (I was using RMySQL but it is not available for 3.0.2)
  MySQL v5.6.14
  OS: Windows Server 7

【问题讨论】:

  • 似乎是一个错误,最好向包维护者报告。
  • @hadley - 我希望它不是,但考虑到它以前可以工作,现在也许不是更新引起了不稳定的事情。我刚刚完全重新安装了 R 和 RMySQL 包(绝望地),但我仍然遇到问题。
  • 并不是说这很有帮助,但我可以确认 PostgreSQL 连接器也存在该错误。我会试着调查一下。我像你一样,@getting-there,写入公共模式,然后从 R 运行两个额外的查询,我将表移动到所需的模式并公开删除它。浪费,但完成了工作。
  • 现有表中是否有自增主键?如果是,您是否看过:stackoverflow.com/questions/26449666/…stackoverflow.com/questions/38427757/…
  • 如果您有答案,请添加并标记为已接受

标签: mysql r


【解决方案1】:

此解决方案由作者在问题中列出,已移至此处。

与简单的temp_table相比,似乎只有在使用完整表路径(例如myDB.temp_table)时才会出现错误/功能

> dbWriteTable(conn=open_connection, name='myDB.temp_table', value=summary_data_final, overwrite=FALSE, append=TRUE, row.names=0)
Error in mysqlExecStatement(conn, statement, ...) : 
  RS-DBI driver: (could not run statement: Table 'temp_table' already exists)
[1] FALSE
Warning message:
In mysqlWriteTable(conn, name, value, ...) :
  could not create table: aborting mysqlWriteTable

> dbWriteTable(conn=open_connection, name='temp_table', value=summary_data_final, overwrite=FALSE, append=TRUE, row.names=0)
[1] TRUE

我在任何地方都没有发现这个文档,我很惊讶我以前没有遇到过它。

【讨论】:

  • 有没有办法写入非默认架构?
  • 另外,还有一种情况是表名应该是小写的——我花了一些时间才找到它。显然只能通过谷歌搜索。来源:github.com/r-dbi/RMySQL/issues/82
【解决方案2】:

只需使用此函数在表格中插入一行

 insert_row <- function(jconn,table_name,col_data,data){
  dbSendUpdate(jconn,paste0("INSERT INTO ",table_name," (",paste0(col_data,collapse=','),") VALUES ('",paste0(data,collapse="','"),"');"))
  print('data inserted')}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2010-12-09
    • 2014-10-26
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多