为什么r / sqlite需要主键?

时间:2013-03-12 04:23:18

标签: r sqlite primary-key

所以我有一个使用以下方法创建的表:

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)

稍后我会创建另一个数据框来插入不同的类型,如下所示:

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

为什么?我的表设置为自动递增主键。我不明白非独特人物的来源。是因为每个的rownames是相同的吗?

1 个答案:

答案 0 :(得分:4)

是的,发生错误是因为每行的rownames相同。您已创建一个具有自动增量ID或ROWID的表。将新行插入SQLite表时,可以将ROWID指定为INSERT语句的一部分,也可以由数据库引擎自动指定。

使用时

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

这里使用选项row.names = TRUE,因此rownames用作增量ID。由于您的2个data.frame具有相同的rownames,因此您会收到错误消息。通常的解决方法是为新创建的行提供一个比插入语句之前的表中最大ROWID大一个的ROWID

例如,你可以这样做:

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)