sql 从 r dataframe 更新数据未插入
sql update data from r dataframe not insert
我有一个包含三列 (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,但它很快就变得很粘,并出现诸如缺少列、索引等错误消息...所以我回到上面的这个例子并尝试学习如何使用基于那个玩具的更新语句数据集。非常感谢大家的帮助。
所以,首先你对 UPDATE
的语法有误。一般来说,
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
所以你不能像你所做的那样将值构建为串联向量。如果您不 select 带有 WHERE
的特定元素,您将在 所有 中更新值 value1
column1
.
编辑:如果您不能匹配条件,那么您实际上并不是在更新,而是在插入,其形式为:
可以用两种形式编写 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 进行实验。
我知道这个问题是 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 上发布了我对这个问题的解决方案。
我有一个包含三列 (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,但它很快就变得很粘,并出现诸如缺少列、索引等错误消息...所以我回到上面的这个例子并尝试学习如何使用基于那个玩具的更新语句数据集。非常感谢大家的帮助。
所以,首先你对 UPDATE
的语法有误。一般来说,
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
所以你不能像你所做的那样将值构建为串联向量。如果您不 select 带有 WHERE
的特定元素,您将在 所有 中更新值 value1
column1
.
编辑:如果您不能匹配条件,那么您实际上并不是在更新,而是在插入,其形式为:
可以用两种形式编写 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 进行实验。
我知道这个问题是 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 上发布了我对这个问题的解决方案。