在一些
post中找到的原始示例
根据这个post,下面的SQL语句应该给我一个向量
1,2,2,2,2到底:
require("RMySQL")
con
dbDriver("MySQL"),
db="your_db",
user="your_user",
password="your_pw",
host="localhost"
)
> con
> dbSendQuery(con, "DROP TABLE IF EXISTS t;")
> dbSendQuery(con, "CREATE TABLE t (i INT NOT NULL AUTO_INCREMENT PRIMARY KEY);")
> dbSendQuery(con, "INSERT INTO t VALUES(NULL);")
> dbGetQuery(con, "SELECT LAST_INSERT_ID() FROM t;")
LAST_INSERT_ID()
1 0
> dbSendQuery(con, "INSERT INTO t VALUES(NULL),(NULL),(NULL);")
> dbGetQuery(con, "SELECT LAST_INSERT_ID() FROM t;")
LAST_INSERT_ID()
1 0
2 0
3 0
4 0
修改了示例,使其比原始用例更像真实用例:
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
嗯,它没有,真的;-)
我已经google了一点,AFAIU,LAST_INSERT_ID()是“连接感知”,因为如果要正常工作必须使用相同的连接.但是,我认为通过将连接对象分配给con我确保在上面的每个语句中确实使用了相同的连接.
好吧,显然不是;-)任何人都可以通过一些解释和/或解决方法帮助我吗?
使用类似于< TABLE>中的select max(< ID>)之类的内容但是,不会削减它,因为我正在运行同时写入数据库的多个线程,因此如果这样做就搞乱了ID检索.
谢谢!
截至2012-04-20的调查结果
>感谢Quassnoi,我能够更多地追踪问题.看起来像RMySQL函数并不真正关心显式conn参数,但每次连接到DB时都会在后台打开新连接.这也可能是一些很好的理由.然而,有谁知道如何避免这种情况?
>刚刚联系了Jeffrey Horner(RMySQL包的维护者).似乎这是一个Windows问题.在Linux上为他工作: – /
连接细节
正如Jeff所建议的那样
> 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]]
> dbGetInfo(dbDriver("MySQL"))
$drvName
[1] "MySQL"
$connectionIds
$connectionIds[[1]]
$connectionIds[[2]]
$connectionIds[[3]]
$fetch_default_rec
[1] 500
$managerId
$length
[1] 16
$num_con
[1] 3
$counter
[1] 179
$clientVersion
[1] "5.5.20"
> dbListConnections(dbDriver("MySQL"))
[[1]]
[[2]]
[[3]]