7

我在 R 中有一个包含 3 列的数据框,使用 sqlSave 我可以轻松地在 SQL 数据库中创建一个表:

channel <- odbcConnect("JWPMICOMP")
sqlSave(channel, dbdata, tablename = "ManagerNav", rownames = FALSE, append = TRUE, varTypes = c(DateNav = "datetime"))
odbcClose(channel)

此数据框包含有关经理的信息(姓名、导航和日期),这些信息每天都会使用当前日期的新值进行更新,如果出现错误,也可能会更新旧值。

我怎样才能在 R 中完成这项任务?

我尝试使用 sqlUpdate 但它返回以下错误:

> sqlUpdate(channel, dbdata, tablename = "ManagerNav")
Error in sqlUpdate(channel, dbdata, tablename = "ManagerNav") : 
  cannot update ‘ManagerNav’ without unique column
4

3 回答 3

8

当您创建“白鲨方式”表时(请参阅文档),它不会获得主索引,而只是普通列,并且通常是错误的类型。通常,我使用您的方法来获取正确的列名,但之后您应该进入数据库并分配主索引、正确的列宽和类型。

之后,sqlUpdate()可能会工作;我说可能,因为我已经放弃了使用sqlUpdate(),有太多的注意事项,并sqlQuery(..., paste("Update....)))用于实际工作。

于 2013-04-23T09:40:38.510 回答
3

我会为此做的是以下

解决方案 1

sqlUpdate(channel, dbdata,tablename="ManagerNav", index=c("ManagerNav"))

解决方案 2

Lcolumns <- list(dbdata[0,]) 
sqlUpdate(channel, dbdata,tablename="ManagerNav", index=c(Lcolumns))

索引用于指定 R 将要更新的列。希望这可以帮助!

于 2014-11-25T16:52:10.417 回答
0

如果其他解决方案都不起作用并且您的数据不是那么大,我建议使用sqlQuery()并遍历您的数据框。

one_row_of_your_df <- function(i) {
  sql_query <- 
paste0("INSERT INTO your_table_name (column_name1, column_name2, column_name3) VALUES",
"(",
"'",your_dataframe[i,1],",",
"'",your_dataframe[i,2],"'",",",
"'",your_dataframe[i,3],"'",",",
")"
  )
  return(sql_query)
}

这个函数是 Exasol 特有的,它与 MySQL 非常相似,但并不完全相同,因此可能需要进行一些小改动。

然后使用一个像这样的简单 for 循环:

 for(i in 1:nrow(your_dataframe)) 
    {
        sqlQuery(your_connection, one_row_of_your_df(i))
    }
于 2022-02-15T20:15:54.230 回答