LAST_INSERT_ID () sempre retorna 0 (RMySQL) - problema de conexão separado

Exemplo original encontrado em algunspostar

De acordo com issopostar as seguintes instruções SQL devem me dar um vetor1, 2, 2, 2, 2 No final:

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
Seguindo sugestões deN.B., Jeff Allen eQuassnoi

Adaptei o exemplo para que ele se assemelhe a casos de uso reais um pouco mais do que o original:

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

Bem, isso não acontece ;-)

Eu pesquisei um pouco e AFAIU,LAST_INSERT_ID() é "ciente de conexão" no sentido de que a mesma conexão deve ser usada para funcionar corretamente. No entanto, eu pensei que, atribuindo o objeto de conexão paracon Eu estava me certificando de que, de fato, a mesma conexãoé usado em cada uma das afirmações acima.

Bem, aparentemente não ;-) Alguém pode me ajudar com algumas explicações e / ou soluções alternativas? Usando algo comoselect max(<ID>) from <TABLE> não vai cortá-lo, no entanto, como eu estou executando vários segmentos que gravam simultaneamente para o banco de dados, bagunçando assim recuperação de ID, se feito dessa forma.

Obrigado!

Resultados de 2012-04-20Graças aQuassnoi Consegui rastrear o problema um pouco mais. Parece queRMySQL funções realmente não se importam com o explícitoconn argumento que muito, mas abrir novas conexões em segundo plano toda vez que você se conectar ao banco de dados. Provavelmente algumas boas razões para isso também. No entanto, alguém sabe como evitar isso?Acabou de entrar em contato com Jeffrey Horner (mantenedor doRMySQL pacote). Parece que este é um problema do Windows. Trabalhou para ele no Linux: - /Detalhes da conexão

Como sugerido porJeff

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

questionAnswers(3)

yourAnswerToTheQuestion