Можно ли вытащить номер ID перед вставкой в базу данных?

seosniks
На сайте с 13.08.2007
Offline
389
1638

Чето туплю, не могу вкурить.

Задача получить номер записи в базе, перед добавлением INSERT INTO

после инсерта можно так $t = mysql_insert_id();

но мне надо знать номер ID до вставки INSERT INTO

Спасибо.

zhitov
На сайте с 30.01.2005
Offline
219
#1
seosniks:
но мне надо знать номер ID до вставки INSERT INTO

Можно поинтересоваться - зачем?

INSERT прекрасно работает и без этого...

Строительные калькуляторы ( https://www.zhitov.com/ )
siv1987
На сайте с 02.04.2009
Offline
427
#2

1. auto_increment

2. SELECT MAX(id)+1 FROM table

3. http://php.net/manual/ru/function.mysql-insert-id.php

seosniks
На сайте с 13.08.2007
Offline
389
#3
zhitov:
Можно поинтересоваться - зачем?
INSERT прекрасно работает и без этого...

Да какой то редиска в доске организовал названия картинок таким образом что картинки имеют название в виде ID новости типа 123.jpg 22.jpg

У меня идет генерация картинки раньше INSERT но проблема не в этом.

В INSERT есть поле image в которое надо кинуть ID добавляющейся новости.

siv1987
На сайте с 02.04.2009
Offline
427
#4

SHOW TABLE STATUS [FROM DB] LIKE 'MY_TABLE'

bsyomov
На сайте с 25.01.2012
Offline
31
#5
siv1987:
1. auto_increment
2. SELECT MAX(id)+1 FROM table
3. http://php.net/manual/ru/function.mysql-insert-id.php

И что будет, если в этот замечательный момент другой поток вставляет запись? =))))

seosniks:

Первым запросом создаёте запись, получаете её ID, после выполнения запроса (INSERT). Вторым запросом вписываете в неё вычисленное на основе ID значение(UPDATE), или например удаляете запись, если она вдруг не нужна.

I
На сайте с 23.12.2010
Offline
25
#6
bsyomov:

И что будет, если в этот замечательный момент другой поток вставляет запись? =))))

seosniks:
Первым запросом создаёте запись, получаете её ID, после выполнения запроса (INSERT). Вторым запросом вписываете в неё вычисленное на основе ID значение(UPDATE), или например удаляете запись, если она вдруг не нужна.

Те же яйца вид сбоку - что произойдет если другой поток вставит запись до "второго" запроса?

Решается такая задача либо транзакциями с локом на таблицу либо обеспечением уникальности id - напр использованием GUID

Еще один вариант - вставляете новую запись причем в ваше поле image записывайте GUID. После этого делайте апдейт:

UPDATE table SET image = id WHERE image=$GUID

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#7
Да какой то редиска в доске организовал названия картинок таким образом что картинки имеют название в виде ID новости типа 123.jpg 22.jpg

А местами блоки поменять никак обработки?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
seosniks
На сайте с 13.08.2007
Offline
389
#8
LEOnidUKG:
А местами блоки поменять никак обработки?

Проблема в том что надо загоднять в INSERT сразу ID новости.

В общем решил проблему так

Сначала лезем в базу узнаем текущее значение ID потом добавляем его кда надо.

 $rsa = mysql_query("SHOW TABLE STATUS FROM $database LIKE 'object'");

while($rows = mysql_fetch_assoc($rsa))
$id_img=$rows['Auto_increment'];

А вот интересно я чето не заметил, по идее надо делать +1 к текущему значению.

Надо проверить.

Хотя проверил, грузит именно так как надо.

bsyomov
На сайте с 25.01.2012
Offline
31
#9
iopiop:
Те же яйца вид сбоку - что произойдет если другой поток вставит запись до "второго" запроса?

Решается такая задача либо транзакциями с локом на таблицу либо обеспечением уникальности id - напр использованием GUID
Еще один вариант - вставляете новую запись причем в ваше поле image записывайте GUID. После этого делайте апдейт:
UPDATE table SET image = id WHERE image=$GUID

А всё будет хорошо - он вставит запись со следующим ID и второй экзкмпляр скрипта будет работать именно с ним, т.к. mysql_insert_id() возращает ID записи вставленной не последним запросом на mysql сервере, а последним запросом в рамках текущего подключения. И не надо ни транзакций ни локов.

seosniks:

Ваш код будет корректно работать до тех пор, пока у вас не будет конкурентных запросов на вставку. В реальном приложении он некорректен напрочь, т.к. между получением ID и INSERT, может пройти ещё один INSERT для которого был получен тот же ID.

I
На сайте с 23.12.2010
Offline
25
#10
bsyomov:
mysql_insert_id() возращает ID записи вставленной не последним запросом на mysql сервере, а последним запросом в рамках текущего подключения.

вы бы не могли ссылочку подкинуть подтверждающую эту информацию? а то мне не удалось найти.

спс.

upd: нашел, вы правы "The value of mysql_insert_id() is affected only by statements issued within the current client connection. It is not affected by statements issued by other clients."

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