【问题标题】:sql update data from r dataframe not insertsql从r数据帧更新数据不插入
【发布时间】:2015-10-23 23:55:36
【问题描述】:

我有一个包含三列 (a,b,c) 的数据框 (df)

我将这些值插入到 SQL 数据库中使用

df <- data.frame(a=1:10, b=10:1, c=11:20)
values <- paste("(",df$a,",", df$b,",",df$c,")", sep="", collapse=",")
cmd <- paste("insert into MyTable values ", values)
result <- sqlQuery(con, cmd, as.is=TRUE) 

来源: How to insert a dataframe into a SQL Server table?

我的问题是这个例子的更新等价物是什么?我该如何使用

cmd <- paste("update MyTable values ", values)
result <- sqlQuery(con, cmd, as.is=TRUE) 

我尝试了 sqlSave 和 sqlUpdate,但它很快就因缺少列、索引等错误消息而变得粘滞……所以我回到上面的这个示例,并尝试学习如何使用基于该玩具数据集的更新语句。非常感谢任何帮助。

【问题讨论】:

  • 查看 RODBC 包中的 sqlUpdate
  • 考虑重新阅读 SQL 教程。插入查询需要列引用,除非您要追加到 所有 列,而更新查询需要 SET 子句。

标签: mysql sql sql-server r rodbc


【解决方案1】:

所以,首先您的 UPDATE 语法错误。一般来说,

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

所以你不能像你所做的那样将值构建为连接向量。如果您不使用WHERE 选择特定元素,您将在column1 中的所有 值中更新value1 值。

编辑:如果你不能匹配条件,那么你实际上并没有更新,你正在插入,它具有以下形式:

可以用两种形式编写 INSERT INTO 语句。

第一种形式没有指定要插入数据的列名,只指定它们的值:

INSERT INTO table_name
VALUES (value1,value2,value3,...);

第二种形式指定了列名和要插入的值:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

如果你想做更复杂的事情,你需要用 SQL 构建查询,可能首先用 R 以外的东西,至少要学习。如果您对 SQL 还不熟悉,可以尝试使用 SQL fiddle

【讨论】:

  • 感谢 Shawn 如果找不到匹配的索引,用户如何强制更新语句插入新记录?
  • ....所以当我使用没有 WHERE 条件的 UPDATE 语句时,它的行为就像 INSERT,对吗?
  • 是的。但这与不匹配 WHERE 不同,后者会失败。
【解决方案2】:

我知道这个问题是 4 年前发布的,但我希望这能帮助其他正在寻找答案的用户。

table <- [NAME OF THE TABLE YOU WANT TO UPDATE]
x <- [YOUR DATA SET]

# We'll need the column names of the table for our INSERT/UPDATE statement
rs <- dbSendQuery(con, paste0('SHOW COLUMNS FROM ', table, ';'))
col_names <- dbFetch(rs)
dbClearResult(rs)

# Find which columns are primary keys as we shouldn't need to update these
pri <- which(col_names$Key == "PRI")

# For each row in your data frame, build an UPDATE statement and query your db
for(i in 1:nrow(x)) {

    # Transform ith row of dataset into character vector
    values <- sapply(x[i, ], as.character)

    # Build the INSERT/UPDATE query
    myquery <- paste0("INSERT INTO ",
                      table,
                      "(", paste(col_names$Field, collapse = ", "), ") ", # column names   
                      "VALUES",
                      "('", paste(values, collapse = "', '"), "') ", # new records
                      "ON DUPLICATE KEY UPDATE ",
                      paste(col_names$Field[-pri], values[-pri], sep = " = '", collapse = "', "), # everything minus primary keys
                      "';")

    # Show full query for clarity
    cat("Performing query", i, "of", nrow(x), ":\n", myquery, "\n\n")

    # Send query to database
    dbSendQuery(con, myquery)

}

如果您正在寻找更有指导性的演练,我刚刚在 GitHub 上发布了我对此问题的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多