【发布时间】:2012-08-10 12:48:05
【问题描述】:
我的数据库表大概是这样的:
+-----+-------+--------------------+-----------+----------+
| ID1 | ID2 | FilePath1 | FilePath2 | Status |
+-----+-------+--------------------+-----------+----------+
| 1 | Test1 | MyFolder\R\Folder1 | NULL | Open |
| 2 | Test2 | MyFolder\R\Folder2 | NULL | Open |
| 3 | Test3 | MyFolder\R\Folder3 | NULL | Finished |
| 4 | Test4 | MyFolder\R\Folder4 | NULL | Finished |
+-----+-------+--------------------+-----------+----------+
第一列 (ID1) 定义为 PK。但是,ID2 也是唯一的。
现在我希望能够使用来自RODBC 包的sqlUpdate() 用R 更改FilePath2 和Status。所以我尝试以下方法:
db.df <- data.frame(ID1=1, ID2='Test1',
FilePath2='MyFolder\R\Folder5', Status='Finished',
stringsAsFactors=FALSE)
sqlUpdate(myconn, db.df, tablename='mytable', index='ID2', verbose=TRUE)
其中db.df 是一个数据框,其中一行和列名对应于数据库表中的行名(但是,我省略了一些列,在本例中为FilePath1,我更愿意省略ID1,如果可能的话)。我的目标是获得以下内容:
+-----+-------+--------------------+--------------------+----------+
| ID1 | ID2 | FilePath1 | FilePath2 | Status |
+-----+-------+--------------------+--------------------+----------+
| 1 | Test1 | MyFolder\R\Folder1 | MyFolder\R\Folder5 | Finished |
| 2 | Test2 | MyFolder\R\Folder2 | NULL | Open |
| 3 | Test3 | MyFolder\R\Folder3 | NULL | Finished |
| 4 | Test4 | MyFolder\R\Folder4 | NULL | Finished |
+-----+-------+--------------------+--------------------+----------+
我收到以下错误:
Error in sqlUpdate(myconn, db.df, tablename = 'mytable', index = 'ID2', :
index column(s) ID2 not in database table
这个问题的原因可能是什么?
编辑:我通过发送直接 SQL 查询绕过了这个问题:
out.path <- 'MyFolder\\\\R\\\\Folder5'
update.query <- paste("UPDATE mytable ",
"SET FilePath2='", out.path, "', Status='Finished' ",
"WHERE ID2='Test1'", sep="")
dummy <- sqlQuery(myconn, update.query)
虽然这可能不是一个简洁的方法,但它做了它应该做的事情。不过还是不明白sqlUpdate是怎么回事,希望有大神指点一下。
【问题讨论】: