我使用以下代码在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
值的任务,即使它们在我运行更新脚本时出现也是如此?
答案 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)卡,因此它显示错误。