LAST _INSERT _ID ()всегда возвращает 0 (RMySQL)-отдельная проблема подключения

Исходный пример, найденный в каком-то сообщении

. Согласно этому сообщению следующие операторы SQL должны дать мне вектор 1, 2, 2, 2, 2в конце:

require("RMySQL")
con <- dbConnect(
    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

Следуя предложениям Н.Б. , Джефф Аллен и 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

Ну, на самом деле это не так ;-)

Я немного погуглил, и AFAIU, LAST_INSERT_ID()"осведомлен о соединении -" в том смысле, что для правильной работы необходимо использовать одно и то же соединение. Однако я думал, что, назначая объект соединения con, я удостоверяюсь, что одно и то же соединение действительно используется в каждом из приведенных выше утверждений.

Ну, по-видимому, нет; -)Кто-нибудь может помочь мне с некоторыми объяснениями и/или обходными путями? Однако использование чего-то вроде select max() from

не поможет, так как я запускаю несколько потоков, которые одновременно записывают в БД, что искажает получение идентификатора, если это делается таким образом.

Спасибо!

Выводы на 2012 год -04 -20

  • Благодаря Quassnoi я смог немного больше проследить проблему.Похоже, что функции RMySQLна самом деле не слишком заботятся о явном аргументе conn, но открывают новые соединения в фоновом режиме каждый раз, когда вы подключаетесь к БД. Вероятно, для этого тоже есть веские причины. Тем не менее, кто-нибудь знает, как этого избежать?
  • Только что связался с Джеффри Хорнером, (сопровождающим 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]]
 


> 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]]
 
6
задан 17 revs, 2 users 74% 23 May 2017 в 12:29
поделиться