2013-03-12 4 views
2

так у меня есть таблица, которая была создана с помощью:Почему r/sqlite требует первичный ключ?

dbGetQuery(conn, "CREATE TABLE Data (DataID integer primary key autoincrement, 
      DataTypeID integer, DataName varchar)") 

после некоторого кода, я создать фрейм данных под названием «insertdata», которое, как это:

type name 
1 1 Data1 
2 1 Data2 
3 1 Data3 
4 1 Data4 
5 1 Data5 

и я использую следующее вставить его в моей таблице:

dbWriteTable(conn, "Data", insertdata, append=TRUE) 

позже я создать еще dataframe для вставки другого типа, например:

type name 
1 2 OtherData1 
2 2 OtherData2 
3 2 OtherData3 
4 2 OtherData4 
5 2 OtherData5 

но когда я использую тот же dbWriteTable, как и прежде, он говорит мне

"Warning message: 
In value[[3L]](cond) : 
    RS-DBI driver: (RS_SQLite_exec: could not execute: PRIMARY KEY must be unique)" 

Почему? Моя таблица настроена на автоматическое увеличение первичного ключа. Я не понимаю, откуда будут появляться неповторимые персонажи. Это потому, что имена розеток одинаковы в каждом?

ответ

4

Да, ошибка возникает из-за того, что имена розеток одинаковы для каждой строки. Вы создали таблицу с идентификатором автоинкремента или ROWID. Когда новая строка вставляется в таблицу SQLite, ROWID может быть указан как часть инструкции INSERT или может автоматически назначаться механизмом базы данных.

При использовании

dbWriteTable(conn, "Data", insertdata, append=TRUE) 

Здесь используется параметр row.names = TRUE, поэтому rownames используются в качестве приращения идентификатора. Поскольку ваши 2 data.frame имеют одинаковые имена ростов, вы получаете ошибку. Обычный рабочий процесс должен дать вновь созданной строке ROWID, которая больше, чем наибольшая ROWID в таблице перед оператором insert.

Например, вы можете сделать это:

driver <- dbDriver("SQLite") 
conn <- dbConnect(driver, dbname='DB_KEY') 
## I read all the table to get rows number, you can optimize this with a clever select 
index <- nrow(dbReadTable(conn,'Data')) 
rownames(mydf) <- 1:nrow(mydf) +index 
dbWriteTable(conn, "Data", mydf, append=TRUE) 
dbDisconnect(conn) 
+0

спасибо. пришлось сделать несколько настроек, но ваш ответ сработал хорошо. – user1714887

Смежные вопросы