いくつかの投稿で見つかった元の例
この投稿によると、次のSQLステートメントは最終的に私にベクトルを与えるはずです
1, 2, 2, 2, 2
:
require("RMySQL")
con <- dbConnect(
dbDriver("MySQL"),
db="your_db",
user="your_user",
password="your_pw",
host="localhost"
)
> con
<MySQLConnection:(6640,122)>
> dbSendQuery(con, "DROP TABLE IF EXISTS t;")
<MySQLResult:(6640,122,0)>
> dbSendQuery(con, "CREATE TABLE t (i INT NOT NULL AUTO_INCREMENT PRIMARY KEY);")
<MySQLResult:(6640,122,1)>
> dbSendQuery(con, "INSERT INTO t VALUES(NULL);")
<MySQLResult:(6640,122,2)>
> dbGetQuery(con, "SELECT LAST_INSERT_ID() FROM t;")
LAST_INSERT_ID()
1 0
> dbSendQuery(con, "INSERT INTO t VALUES(NULL),(NULL),(NULL);")
<MySQLResult:(6640,122,3)>
> dbGetQuery(con, "SELECT LAST_INSERT_ID() FROM t;")
LAST_INSERT_ID()
1 0
2 0
3 0
4 0
NB、Jeff Allen、Quassnoiによる提案に従って
この例を、元のユースケースよりも少し実際のユースケースに似せるように調整しました。
dbSendQuery(con, "DROP TABLE IF EXISTS t;")
dbSendQuery(con, paste("CREATE TABLE t",
"(i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, x INT);"))
> dbGetQuery(con, "SELECT CONNECTION_ID();")
CONNECTION_ID()
1 673490
dbSendQuery(con, "INSERT INTO t SET x=1;")
> dbGetQuery(con, "SELECT CONNECTION_ID();")
CONNECTION_ID()
1 673491
> dbGetQuery(con, "SELECT LAST_INSERT_ID();")
LAST_INSERT_ID()
1 0
> dbGetQuery(con, "SELECT CONNECTION_ID();")
CONNECTION_ID()
1 673493
> dbGetQuery(con, "SELECT LAST_INSERT_ID();")
LAST_INSERT_ID()
1 0
dbSendQuery(con, "INSERT INTO t SET x=2;")
> dbGetQuery(con, "SELECT LAST_INSERT_ID();")
LAST_INSERT_ID()
1 0
> dbGetQuery(con, "SELECT * FROM t;")
i x
1 1 1
2 2 2
まあ、そうではありません、本当に;-)
私は少しググってみましたが、AFAIULAST_INSERT_ID()
は、正しく機能するためには同じ接続を使用する必要があるという意味で「接続認識」です。ただし、接続オブジェクトを割り当てることで、上記の各ステートメントでcon
実際に同じ接続が使用されていることを確認していると思いました。
まあ、明らかにそうではありません;-)誰かがいくつかの説明や回避策で私を助けることができますか?ただし、DBに同時に書き込む複数のスレッドを実行しているため、のようなものを使用してselect max(<ID>) from <TABLE>
も、それを削減することはできません。そのため、そのようにするとIDの取得が台無しになります。
ありがとう!
2012年4月20日現在の調査結果
- Quassnoiのおかげで、問題をもう少し追跡することができました。
RMySQL
関数は明示的な引数をそれほど気にしないようconn
ですが、DBに接続するたびにバックグラウンドで新しい接続を開きます。おそらくこれにもいくつかの正当な理由があります。それでも、これを回避する方法を知っている人はいますか? - Jeffrey Horner(RMySQLパッケージのメンテナー)に連絡しました。これはWindowsの問題のようです。Linuxで彼のために働いた:-/
接続の詳細
ジェフが提案したように
> dbGetInfo(con)
$host
[1] "localhost"
$user
[1] "your_user"
$dbname
[1] "your_db"
$conType
[1] "localhost via TCP/IP"
$serverVersion
[1] "5.5.20"
$protocolVersion
[1] 10
$threadId
[1] 673489
$rsId
$rsId[[1]]
<MySQLResult:(6640,171,3)>
> dbGetInfo(dbDriver("MySQL"))
$drvName
[1] "MySQL"
$connectionIds
$connectionIds[[1]]
<MySQLConnection:(6640,149)>
$connectionIds[[2]]
<MySQLConnection:(6640,112)>
$connectionIds[[3]]
<MySQLConnection:(6640,171)>
$fetch_default_rec
[1] 500
$managerId
<MySQLDriver:(6640)>
$length
[1] 16
$num_con
[1] 3
$counter
[1] 179
$clientVersion
[1] "5.5.20"
> dbListConnections(dbDriver("MySQL"))
[[1]]
<MySQLConnection:(6640,149)>
[[2]]
<MySQLConnection:(6640,112)>
[[3]]
<MySQLConnection:(6640,171)>