[MySQL] Возможно ли определить id вставленных записей с помощью Multi Insert

12
lstaticl
На сайте с 07.02.2008
Offline
82
3670

Собстна сабж, есть MultiInsert запрос. Например:

INSERT INTO `table` (`title`, `value`) VALUES ('1', '1'), ('2','2'), ('3','3');

Он вставит в БД(MySQL) 3 записи. (но не известно с какими ID). Ограничений на вставку никаких нет, а значит в один момент времени могут начать вставлять 2 и более пользователя.

Вопрос: Возможно ли как-то узнать id записей, что вставил такой запрос?

Хочу выиграть MacBook (http://contest.adkeeper.ru)
DarkwaveMD
На сайте с 29.06.2010
Offline
24
#1
Zebrum CMS cо скидкой до 10% - подробности (http://darkwavemd.com/zebrum-cms-pervye-vpechatleniya.html). Найми меня (https://www.odesk.com/users/~~acc604206a25aec7) на oDesk
lstaticl
На сайте с 07.02.2008
Offline
82
#2
DarkwaveMD:
Попробуйте http://www.php.su/functions/?mysql_insert_id

Вы или невнимательно читаете задачу, или не понимаете сути вопроса... эта функция не вернет требуемый результат.

Еще варианты есть?

CB
На сайте с 19.11.2009
Offline
28
#3

lstaticl, MySQL умный.

mysql_insert_id() выдаст первый идентификатор

mysql_insert_id()+3 - выдаст последний идентификатор

Если запустить два процесса на вставку параллельно, второй будет ждать окончания первого. Как заметил netwind, при innodb нужно проверять дополнительно.

N
На сайте с 06.05.2007
Offline
419
#4

по идее C-api это позволяет - посылать пачку запросов и последовательно забирать результаты

не уверен что в php это реализовано правильно.

http://ru.php.net/manual/en/mysqli.multi-query.php

А расскажите зачем вам это нужно?

Числом запросов много времени не сэкономить. Подобное используется если mysql-сервер подключается по тормозной сети. Тогда отправка мелких запросов крупными пачками и получение ответа опять же пачкой выгоднее по времени.

netwind добавил 24.01.2011 в 15:57

CyBase:
lstaticl, MySQL умный.
mysql_insert_id() выдаст первый идентификатор
mysql_insert_id()+3 - выдаст последний идентификатор

Если запустить два процесса на вставку параллельно, второй будет ждать окончания первого

интересно. но что произойдет если используется innodb ? я не знаю, кстати.

счетчик auto increment он как бы сам по себе и не зависит числа вставленных записей.

Кнопка вызова админа ()
rtyug
На сайте с 13.05.2009
Offline
263
#5

на сколько я помню, то в исходниках mysql_insert_id как раз идет обычный запрос select max(id) ...

Спалил тему: Pokerstars вывод WMZ, etc на VISA 0% или SWIFT + Конверт USD/GBP,etc (net profit $0,5 млрд) (https://minfin.com.ua/blogs/94589307/115366/) Monobank - 50₴ на счет при рег. тут (https://clck.ru/DLX4r) | Номер SIP АТС Москва 7(495) - 0Ꝑ, 8(800) - 800Ꝑ/0Ꝑ (http://goo.gl/XOrCSn)
CB
На сайте с 19.11.2009
Offline
28
#6
интересно. но что произойдет если используется innodb ?

Честно, не знаю. Не проверялся.

rtyug
На сайте с 13.05.2009
Offline
263
#7

а нет, забираю слова назад, точно не знаю, может оно как-то на API MySQL

last_insert_id	=> { U =>[5,6,'$catalog, $schema, $table_name, $field_name [, \%attr ]'], O=>0x2800 },
lstaticl
На сайте с 07.02.2008
Offline
82
#8
netwind:

А расскажите зачем вам это нужно?
Числом запросов много времени не сэкономить. Подобное используется если mysql-сервер подключается по тормозной сети. Тогда отправка мелких запросов крупными пачками и получение ответа опять же пачкой выгоднее по времени.

Это нужно чтобы сильно сэкономить время и нагрузку на сервер БД.

Давно проверено, что INSERT запросы в цикле отрабатывают значительно медленнее, чем MULTI-запрос. (Одна из тем: http://zendframework.ru/forum/index.php?topic=850.msg5800#msg5800)

lstaticl добавил 24.01.2011 в 16:32

Если запустить два процесса на вставку параллельно, второй будет ждать окончания первого.

если это правда, то тогда утверждение про +3 годится

mysql_insert_id() выдаст первый идентификатор
mysql_insert_id()+3 - выдаст последний идентификатор
N
На сайте с 06.05.2007
Offline
419
#9
lstaticl:
Давно проверено, что INSERT запросы в цикле отрабатывают значительно медленнее, чем MULTI-запрос. (Одна из тем: http://zendframework.ru/forum/index....sg5800#msg5800)

Слишком безаппеляционно, не находите?

Допустим вы напишите большую вставку и тем самым заблокируете select-запросы и скрипты всего сайта (!) остановятся на 1-5 секунд, после чего все вместе начнут исполнятся - нагрузка скаканет и неизвестно выравняется ли потом вообще.

lstaticl
На сайте с 07.02.2008
Offline
82
#10
netwind:
Слишком безаппеляционно, не находите?

Допустим вы напишите большую вставку и тем самым заблокируете select-запросы и скрипты всего сайта (!) остановятся на 1-5 секунд, после чего все вместе начнут исполнятся - нагрузка скаканет и неизвестно выравняется ли потом вообще.

Нахожу. И с удовольствием поразмышлял бы на тему более предметно. Но есть задача, которую надо решить в срок.

Дело не в настолько большой вставке, которая повесит базу на >=1 сек. Я тут размышляю более локально, что в рамках данной задачи, проблемы больше за собой тянет вариант если гонять много INSERT'ов в циклах, чем multi insert.

А вопрос собстна так и остался нераскрытым. Есть ли возможность получить список вставленных ID.

Я так понимаю "безкостыльного" - нету.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий