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