r - 为什么 r/sqlite 需要主键?

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

这是为什么呢?我的表设置为自动递增主键。我不明白非独特字符的来源。是因为每个行名都相同吗?

最佳答案

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

当你使用

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

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

例如你可以这样做:

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)

关于r - 为什么 r/sqlite 需要主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15353290/

相关文章:

mysql - 对于我在特定表中尝试的每个 INSERT 查询,键 'PRIMARY' 的重复条目

删除由 R 中的 grid.arrange 函数产生的两个图之间的空白

r - 我的类(class)怎么了?

r - 排序表唯一参数

android - 在 mysql lite 数据库中保存 5000 个对象

sql - DB Designer 创建复合主键

r - 将一组可用的 R 命令包装到函数中的问题

python - 如何将光标对象的输出存储到文本文件?

ios - 当字段来自 sqlite 数据库时点击 didSelectRowAtIndexPath

mysql - 为什么auto_increment id不一一增加,怎么设置呢?