mysql获取id一直是0_LAST_INSERT_ID()始终返回0(RMySQL) – 单独的连接问题

博主在使用 RMySQL 包与 MySQL 数据库交互时遇到问题,发现 LAST_INSERT_ID() 函数返回的结果不正确,尤其是在多线程写入时。他们注意到每个 SQL 语句似乎都在新的连接上下文中运行,导致 ID 检索混乱。进一步调查表明,这可能是 RMySQL 在 Windows 上的一个问题,而在 Linux 上工作正常。博主已经联系了包的维护者以寻求解决方案。
摘要由CSDN通过智能技术生成

在一些

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值