3

だから私は以下を使用して作成されたテーブルを持っています:

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

何故ですか?私のテーブルは、主キーを自動インクリメントするように設定されています。ユニークでないキャラクターがどこから来るのかわかりません。行名がそれぞれ同じだからですか?

4

1 に答える 1

6

はい、行名が各行で同じであるため、エラーが発生します。オートインクリメント ID または ROWID を持つテーブルを作成しました。新しい行が SQLite テーブルに挿入されるとき、ROWID は INSERT ステートメントの一部として指定するか、データベース エンジンによって自動的に割り当てることができます。

使用するとき

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

ここではオプションを使用してrow.names = TRUEいるため、行名がインクリメント ID として使用されます。2 つの data.frame には同じ rownames があるため、エラーが発生します。通常の回避策は、insert ステートメントの前に、テーブル内の最大の ROWID よりも 1 大きい 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)
于 2013-03-12T05:27:10.387 に答える