mysql - 使用 R 和 ORDBC 在数据库的单个表上插入数据框

标签 mysql sql r rodbc

如何将完整的数据帧插入到 mysql 数据库的单个表中

这是我的 table

CREATE TABLE `data` (
`iddata` int(11) NOT NULL,
`x` varchar(45) DEFAULT NULL,
`y` varchar(45) DEFAULT NULL,
 PRIMARY KEY (`iddata`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是我的 R 代码:

file <- paste("C:\\Users\\zakaria\\Documents\\RDMZ\\test_rr.csv")
table <- read.table(file,sep=",",header=T)
channel <-odbcConnect(dsn="RSQL",uid="root",pwd="toor")
x <-table[,1]
y<-table[,2]



data<-sqlQuery(channel,paste("INSERT INTO 'data'.'dbwin'('x','y') VALUES (", x,", ", y, ");"))
sqlQuery(channel,data)

我有这个错误

[1] "42000 1064 [MySQL][ODBC 5.2(w) Driver][mysqld-5.6.17]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '42000 1064 [MySQL][ODBC 5.2(w) Driver][mysqld-5.6.17]You have an error in your S' at line 1"                   
[2] "[RODBC] ERROR: Could not SQLExecDirect '42000 1064 [MySQL][ODBC 5.2(w) Driver][mysqld-5.6.17]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''data'.'dbwin'('x','y') VALUES ( 0.708007801949862 ,  84 )' at line 1'"

谢谢你的帮助

最佳答案

最好的方法是按照 @joran 的建议:使用 sqlSave(...) ,就是为此而设计的。

您的代码无法运行有多种原因。一个问题是您定义 xyvarchar ,但您不引用 sql 中的字符串。

x<-"A"
y<-"B"
sql <- paste("INSERT INTO 'data'.'dbwin'('x','y') VALUES (", x,", ", y, ");")
cat(sql)
# INSERT INTO 'data'.'dbwin'('x','y') VALUES ( A ,  B );

相反,使用这个:

sql <- paste0("INSERT INTO 'data'.'dbwin'('x','y') VALUES (\"", x,"\", \"", y, "\");")
cat(sql)
# INSERT INTO 'data'.'dbwin'('x','y') VALUES ("A", "B");

第二个是您不需要在 sql 中包含数据库名称,因为该信息已嵌入在连接中。相反,使用类似的东西:

sql <- "INSERT INTO data (x,y) values (\"A\",\"B\")"

最后,也是最重要的,这种形式的 INSERT 会向数据库表中添加一行,因此您不能对 x 和 y 使用向量(就像您的代码那样)。这是一个解决方法:

## not tested
apply(table[,1:2], 1, function(values) {
  x    <- values[1]
  y    <- values[2]
  sql  <- paste0("INSERT INTO data (x,y) VALUES (\"", x,"\", \"", y, "\");")
  data <-sqlQuery(channel,sql)
  sqlQuery(channel,data)
})

这将(应该..)为 table 的每一行执行 SQL INSERT 。它可能会慢于 sqlSave(...)不过。

最后,您不需要两次调用 sqlQuery(...) .

关于mysql - 使用 R 和 ORDBC 在数据库的单个表上插入数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22842594/

相关文章:

mysql - 行大小太大(> 8126)我可以将 InnoDB 更改为 MyISAM

mysql - 我如何将 mysql count 与 select 查询一起使用?

sql - 如何在 Oracle/SQL 中检索给定序列中的行?

r - 点边标签中的下标和希腊字母

r - 是否可以在 R 中绘制镜像翻转的文本?

php - laravel sql 查询中的语法错误

php - mysql:在控制台中工作正常,在 php 中将无法访问数据

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - MySQL 中的“条件连接”-(条件下的不同连接)

oracle - 如何让 OCI 库在带有 R Oracle 的红帽机器上工作?