RODBC:sqlUpdate()无法识别索引列

Anj*_*jaM 9 sql r rodbc

我的数据库表看起来大致如下:

+-----+-------+--------------------+-----------+----------+
| 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 |
+-----+-------+--------------------+-----------+----------+
Run Code Online (Sandbox Code Playgroud)

第一列(ID1)定义为PK.但是,ID2也是独一无二的.

现在,我希望能够改变FilePath2Status用,使用R sqlUpdate()RODBC包.所以我尝试以下方法:

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)
Run Code Online (Sandbox Code Playgroud)

其中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 |
+-----+-------+--------------------+--------------------+----------+
Run Code Online (Sandbox Code Playgroud)

我得到了以下错误:

Error in sqlUpdate(myconn, db.df, tablename = 'mytable', index = 'ID2',  : 
index column(s) ID2 not in database table
Run Code Online (Sandbox Code Playgroud)

这个问题可能是什么原因?


编辑:我通过发送直接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)
Run Code Online (Sandbox Code Playgroud)

虽然这可能不是一种简洁的方式,但它可以做它应该做的事情.但是,我仍然不明白这是怎么回事sqlUpdate,所以我希望有人能够阐明它.

Wya*_*man 0

sqlUpdate 对我有用。我唯一需要更改的是 db.df - 需要将字符加倍,\以便它不会尝试用它转义代码。我的测试表如下所示:

CREATE TABLE mytable  (
    ID1 INT NOT NULL PRIMARY KEY,
    ID2 VARCHAR(10) NOT NULL,
    FilePath1 VARCHAR(50) NOT NULL,
    FilePath2 VARCHAR(50) NULL,
    Status VARCHAR(15) NOT NULL)

insert into mytable values(1,'Test1','MyFolder\R\Folder1',NULL,'Open')
insert into mytable values(2,'Test2','MyFolder\R\Folder2',NULL,'Open')
insert into mytable values(3,'Test3','MyFolder\R\Folder3',NULL,'Finished')
insert into mytable values(4,'Test4','MyFolder\R\Folder4',NULL,'Finished')
Run Code Online (Sandbox Code Playgroud)

我能够在更新中没有 ID1 或 FilePath1 字段的情况下运行更新。如果您阅读文档(?sqlUpdate),它会指出:“首先它查找表的主键,然后查找数据库认为唯一定义行的最佳列”,因此您没有使用主键,但如果您不知道 ID2 是唯一的,则最好使用该主键。

db.df <- data.frame(ID2='Test1', FilePath2='MyFolder\\R\\Folder5', Status='Finished',                    stringsAsFactors=FALSE)
sqlUpdate(myconn, db.df, tablename='mytable', index='ID2', verbose=TRUE)
Run Code Online (Sandbox Code Playgroud)