Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сделать запись с одновременным получением её идентификатора
 
 автор: Владимир55   (02.02.2009 в 18:49)   письмо автору
 
 

При осуществлении записи в таблицу с помощью INSERT INTO, новой записи автоматически назначается идентификатор. Как получить идентификатор данной конретной строки сразу после того, как ее записали?

С тем, чтобы последующие записи, если они идут сплошным потоком, не создали ошибок?

  Ответить  
 
 автор: Trianon   (02.02.2009 в 18:53)   письмо автору
 
   для: Владимир55   (02.02.2009 в 18:49)
 

я правильно понимаю, что поиском мы пользоваться брезгуем?

  Ответить  
 
 автор: Владимир55   (02.02.2009 в 19:12)   письмо автору
 
   для: Trianon   (02.02.2009 в 18:53)
 

Нет, я видел Ваш пост за 2007 год, где Вы предлагали вызывать mysql_insert_id() сразу после INSERT INTO.

Но ведь это же операторы рнр, и, как уже на форуме писалось, они не гарантируют, что будут выполнены друг за другом, и между ними не вклинится иная запись. Я и сам с этим встретился при записи в файл, когда в статике всё работает хорошо, а в сети раз в неделю происходит сбой, ибо находятся пользователи, которые "лезут друг на друга".

База, как я полагал, от этих проблем свободна.

Не так?

  Ответить  
 
 автор: BinLaden   (02.02.2009 в 19:16)   письмо автору
 
   для: Владимир55   (02.02.2009 в 19:12)
 

> Но ведь это же операторы рнр, и, как уже на форуме писалось, они не гарантируют

Кем писалось? Насколько я знаю всё должно быть нормально.

  Ответить  
 
 автор: Trianon   (02.02.2009 в 19:17)   письмо автору
 
   для: Владимир55   (02.02.2009 в 19:12)
 

> предлагали вызывать mysql_insert_id() сразу после INSERT INTO.
>Но ведь это же операторы рнр, и, как уже на форуме писалось, они не гарантируют,

они-то как раз и гарантируют.
В форуме много чего пишется... сами понимаете... и много кем.

  Ответить  
 
 автор: Владимир55   (02.02.2009 в 19:35)   письмо автору
 
   для: Trianon   (02.02.2009 в 19:17)
 

А по идее (при желании), можно сделать абсолютно надежно, если действовать в обратном порядке:
- создать предварительную служебную запись чтобы просто занять строку;
- получить идентификатор этой записи, отыскав ее по заранее заложенному служебному признаку (например, microtime);
- занести в эту строку ту информацию, которую там в действительности нужно хранить.

Так будет лучше?

  Ответить  
 
 автор: Trianon   (02.02.2009 в 19:41)   письмо автору
 
   для: Владимир55   (02.02.2009 в 19:35)
 

В том то и дело, что Вы не сможете задать такой признак руками, так чтоб он был уникален.
Потому как параллельно исполняющийся вызов того же скрипта тоже поставит такой же такой признак.
А гарантию дает либо mysql_insert_id либо SELECT LAST_INSERT_ID()

  Ответить  
 
 автор: Владимир55   (02.02.2009 в 20:16)   письмо автору
 
   для: Trianon   (02.02.2009 в 19:41)
 

"Вы не сможете задать такой признак руками, так чтоб он был уникален"

Вероятно, сделать такой признак вполне возможно. Например, путем задания времени с точностью до 1 микросекунды
    list($usec, $sec) = explode(" ", microtime());
    $metka = ($sec + $usec)*1000000 ;

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

Но меня заинтересовало другое: может быть, LAST_INSERT_ID работает в контексте текущего соединения?

  Ответить  
 
 автор: Trianon   (02.02.2009 в 20:25)   письмо автору
 
   для: Владимир55   (02.02.2009 в 20:16)
 

>Но меня заинтересовало другое: может быть, LAST_INSERT_ID работает в контексте текущего соединения?

Так и есть. Иначе обе эти функции не имели бы смысла.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования