RSQLite插入忽略以跳过重复项

时间:2013-07-04 04:40:13

标签: sql r sqlite

我有一个带有x,y和z列的sqlite表。 x和y是唯一键,z是值。

我想使用R将数据插入此表。如果正在插入基于x和y字段的重复记录,我希望sqlite拒绝该记录并继续。在sql中,这可以使用“insert或ignore”来完成,这可以使用R包RSQLite来完成吗?到目前为止,有一个选项dbWriteTable将R数据帧写入sqlite表,但似乎没有“插入或忽略”的选项

4 个答案:

答案 0 :(得分:2)

我找到了dbWriteTable构造sql字符串并将其发送到sqlite的源代码。您可以使用此修改后的源来允许“插入或忽略”语法

https://gist.github.com/jeffwong/5925000

答案 1 :(得分:1)

results <- dbSendQuery(exampledb, "insert or ignore ...") 

dbSendQuery根据DBI spec获取原始SQL。希望有所帮助...

答案 2 :(得分:0)

由于我有类似的问题,这是一次性解决方案:

library(RSQLite)

# create table
con <- dbConnect(drv=RSQLite::SQLite(), ":memory:")
dbExecute(con, "CREATE TABLE tab1 (a CHAR(6) NOT NULL, b CHAR(6) NOT NULL, PRIMARY KEY (a, b));")
dat1 <- data.frame(a=letters[1:10], b=LETTERS[11:20], stringsAsFactors=FALSE)
dbWriteTable(con, "tab1", dat1, append=TRUE)

# new data, partly redundant
dat2 <- data.frame(a=letters[2:11], b=LETTERS[12:21], stringsAsFactors=FALSE)

# we want to add only the new combinations of a and b
insertnew <- dbSendQuery(con, "INSERT OR IGNORE INTO tab1 VALUES (:a,:b)")
dbBind(insertnew, params=dat2) # execute
dbClearResult(insertnew)  # release the prepared statement

# should be TRUE
as.numeric(dbGetQuery(con, "SELECT COUNT(*) FROM tab1;"))==11

答案 3 :(得分:0)

通过@Karsten W重做答案,以相同的过程加载所有数据:

if (buffer[0] != 0)