RSQLite insert игнорировать, чтобы пропустить дубликаты

У меня есть таблица sqlite со столбцами x, y и z. x и y - уникальные ключи, а z - значение.

Я хотел бы использовать R для вставки данных в эту таблицу. Если вставляется повторяющаяся запись, основанная на полях x и y, я бы хотел, чтобы sqlite отклонил запись и продолжил. В SQL это можно сделать с помощью "вставить или игнорировать", это можно сделать с помощью пакета R RSQLite? До сих пор существует опция dbWriteTable, которая записывает фрейм данных R в таблицу sqlite, но не похоже, что есть опция "вставить или игнорировать"

4 ответа

Решение

Я нашел источник, где dbWriteTable создает строку sql и отправляет ее в sqlite. Вы можете использовать этот измененный источник, чтобы разрешить синтаксис "вставить или игнорировать"

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

Пересмотр ответа от @Karsten W для загрузки всех данных одним и тем же процессом:

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));")

load_data <- function(x) {
    # load data
    # 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=x)  # execute
    dbClearResult(insertnew)     # release the prepared statement
}


# new data
dat1 <- data.frame(a=letters[1:10], b=LETTERS[11:20], stringsAsFactors=FALSE)
load_data(dat1)
print(dbGetQuery(con, "SELECT COUNT(*) FROM tab1;"))

# new data, partly redundant
dat1 <- data.frame(a=letters[2:11], b=LETTERS[12:21], stringsAsFactors=FALSE)
load_data(dat1)
print(dbGetQuery(con, "SELECT COUNT(*) FROM tab1;"))

Поскольку у меня была похожая проблема, вот одноразовое решение:

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
results <- dbSendQuery(exampledb, "insert or ignore ...") 

dbSendQuery принимает необработанный SQL согласно спецификации DBI. Надеюсь, это поможет...

Другие вопросы по тегам