powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вставить новую строку и получить значение автоинкрементного поля одним запросом.
8 сообщений из 8, страница 1 из 1
Вставить новую строку и получить значение автоинкрементного поля одним запросом.
    #33377633
samon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я далеко не специалист в mysql но столкнулс с необходимостью решить следущую задачу.

Пишу скрипт для www в котором должен выписываться счет на оплату.

Скажем есть таблица с полями
Код: plaintext
1.
id primary, auto_increment
order

Мне необходимо, чтобы пользователь по одному запросу создавал новую строку в этой таблице и сразу получал id только что созданной строки.

Конечно можно использовать select MAX(id) что явно не корректно, так как в это же время другой процесс мог создать слудещее значение id что приведет к тому, что один и тот же id будет возвращен 2м или более клиентам.

Использую mysql 4.1.

Понимаю что подобная задача классически должна рашаться с ипользованием хранимых процедур (и)или блокировок.

Нужен Ваш совет.
...
Рейтинг: 0 / 0
Вставить новую строку и получить значение автоинкрементного поля одним запросом.
    #33377649
Village
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mysql_insert_id([int $link_identifier])
Функция возвращает непосредственно перед ее вызовом сгенерированный идентификатор записи для автоинкрементного поля после выполнения команды insert. Вызывать ее разумно только сразу после выполнения инструкции insert, например, в таком контексте:
mysql_query("insert into Таблица(поле 1, поле 2) values("aa","bb")");
$id=mysql_insert_id();
...
Рейтинг: 0 / 0
Вставить новую строку и получить значение автоинкрементного поля одним запросом.
    #33378198
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Village
почему вы решили, что автору топика нужны API РНР???

2 samon
RTFM
----------------------------------------
Артисты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
Вставить новую строку и получить значение автоинкрементного поля одним запросом.
    #33378455
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одним запросом не получится в 4.1 и вообще не получится ни в каком сервере БД, и знакомство с MySQL тут не при чем.
Делается 2-мя запросами, табличка для примера такая

Код: plaintext
1.
2.
3.
4.
CREATE TABLE `table2` (
  `ID` smallint( 6 ) NOT NULL auto_increment,
  `Value` varchar( 50 ) default NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Запросы такие
Код: plaintext
1.
insert into table2(Value) VALUES('test');
select LAST_INSERT_ID();

Для 5.0 это можно положить в процедуру, тогда из клиента это будет 1 запрос - вызов хранимой процедуры, в 4.1 нельзя, т.к. хранимок нет.
...
Рейтинг: 0 / 0
Вставить новую строку и получить значение автоинкрементного поля одним запросом.
    #33378552
samon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валентин КОдним запросом не получится в 4.1 и вообще не получится ни в каком сервере БД, и знакомство с MySQL тут не при чем.
Делается 2-мя запросами, табличка для примера такая

Код: plaintext
1.
2.
3.
4.
CREATE TABLE `table2` (
  `ID` smallint( 6 ) NOT NULL auto_increment,
  `Value` varchar( 50 ) default NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Запросы такие
Код: plaintext
1.
insert into table2(Value) VALUES('test');
select LAST_INSERT_ID();

Для 5.0 это можно положить в процедуру, тогда из клиента это будет 1 запрос - вызов хранимой процедуры, в 4.1 нельзя, т.к. хранимок нет.

Спасибо всем ответившим.

то Валентин.

Я именно таким способом и делаю.
Но нет никаких гарантий, что другой сеанс не вставит новую строку между выполнением
Код: plaintext
insert into table2(Value) VALUES('test');
и получением
Код: plaintext
select LAST_INSERT_ID();
.

Именно поэтому я и спрашиваю, если мы не можем использовать хранимую процедуру (а это основной правильный вариант), то как еще можно перестраховаться от ввода новой строки до момента получения id только что введенной этим процессом?

Я так понимаю что остаются блокировки. Может есть более правильные решения?
...
Рейтинг: 0 / 0
Вставить новую строку и получить значение автоинкрементного поля одним запросом.
    #33378594
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИменно поэтому я и спрашиваю, если мы не можем использовать хранимую процедуру (а это основной правильный вариант), то как еще можно перестраховаться от ввода новой строки до момента получения id только что введенной этим процессом?

Я так понимаю что остаются блокировки. Может есть более правильные решения?
Моя ссылка не была прочитана, в следствие чего начинает изборетаться велосипед.
----------------------------------------
Артисты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
Вставить новую строку и получить значение автоинкрементного поля одним запросом.
    #33378655
rikman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
You can retrieve the most recent AUTO_INCREMENT value with the LAST_INSERT_ID() SQL function or the mysql_insert_id() C API function. These functions are connection-specific, so their return values are not affected by another connection which is also performing inserts.

Note: For a multiple-row insert, LAST_INSERT_ID() and mysql_insert_id() actually return the AUTO_INCREMENT key from the first of the inserted rows. This allows multiple-row inserts to be reproduced correctly on other servers in a replication setup.
...
Рейтинг: 0 / 0
Вставить новую строку и получить значение автоинкрементного поля одним запросом.
    #33379401
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
Код: plaintext
show table status
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вставить новую строку и получить значение автоинкрементного поля одним запросом.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]