在R中将新数据追加到sqlite数据库

时间:2018-07-26 17:22:54

标签: r r-dbi rsqlite

我使用以下代码在R的sqlite3数据库中创建了一个表:-

con <- DBI::dbConnect(drv = RSQLite::SQLite(),
                      dbname="data/compfleet.db")
s<- sprintf("create table %s(%s, primary key(%s))", "PositionList",
                             paste(names(FinalTable), collapse = ", "),
                             names(FinalTable)[2])
dbGetQuery(con, s)

dbDisconnect(con)

表的第二列是UID,它是主键。然后,我运行一个脚本来更新表中的数据。更新的数据可能包含表中已经存在的相同UID。我不想更新这些现有记录,而只是希望将新记录(具有新的UID值)附加到此数据库。我使用的代码是:-

DBI::dbWriteTable(con, "PositionList", FinalTable, append=TRUE, row.names=FALSE, overwite=FALSE)

哪个返回错误:

Error in result_bind(res@ptr, params) : 
  UNIQUE constraint failed: PositionList.UID

如何实现仅添加新的UID值而不更改现有UID值的任务,即使它们在我运行更新脚本时出现也是如此?

2 个答案:

答案 0 :(得分:1)

您可以查询现有的UID(作为一列数据框),并从要插入的表中删除相应的行。

uid_df <- dbGetQuery(con, "SELECT UID FROM PositionList")
dbWriteTable(con, "PositionList", FinalTable[!(FinalTable$UID %in% uid_df[[1]]), ], ...)

答案 1 :(得分:0)

当您要插入数据时,首先使用UID从数据库中获取数据。如果数据不存在,则可以使用新的UID插入新数据。不存在重复的主键(UID)卡,因此它显示错误。