Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> получить значение автоинкремента 
:(
    Опции темы
Trotil
Дата 9.12.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 31.7.2005

Репутация: нет
Всего: нет



Задача: получить значение автоинкремента в таблице ДО вставки записи (так что mysql_insert_id не подходит)

Цель: вставить в таблицу данные, зависящие от этого id. Сейчас мне приходится создавать новую запись, а затем ее корректировать одно поле, используя этот полученный id... Нехорошо.
PM MAIL   Вверх
skyboy
Дата 9.12.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



    в `information_schema`.`tables`.`auto_increment` хранится значения(последнее использованное, видимо) автоинкремента для определенных таблиц определенных схем. 
PM MAIL   Вверх
Feldmarschall
Дата 14.12.2007, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



skyboy, это неправильный подход, разумеется.

То, как делается сейчас - правильно и хорошо.
PM   Вверх
skyboy
Дата 15.12.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Feldmarschall @  14.12.2007,  21:22 Найти цитируемый пост)
это неправильный подход, разумеется.

разумеется.
не хочу показаться упрямым, но... обоснование, пожалуйста. интересно.
Цитата(Trotil @  8.12.2007,  23:59 Найти цитируемый пост)
а затем ее корректировать одно поле, используя этот полученный id

триггер не подойдет?
PM MAIL   Вверх
Feldmarschall
Дата 15.12.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



Да очевидное же обоснование.
Пока узнавали id - прошла другая вставка - узнали неверный.
PM   Вверх
skyboy
Дата 15.12.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Feldmarschall, ну, да. 
но в общем случае - и вставка с последующим чтением записи - не панацея.
если есть совокупность полей с явно уникальным сочетанием значений(естественный ключ), то ещё куда ни шло. Но, раз используется искусственный ключ(автоинкремент), никто не может гарантировать, что после вставки записи до чтения соотвествующего значения автоинкремента не произойдет вставка записи с такими же значениями полей(всеми, кроме автоинкрементного поля). и при последующем использовании считанного автоинкрементного значения на одну из дублирующихся(по крайней мере, с точки зрения содержания; автоинкрементное поле и генерируемые на стороне сервера(триггеры, timestamp с on update) значения полей могут отличаться) записей будет две ссылки/связи из остальных таблиц, а на другую - ни одной. 
вероятность сего(вставки записей с одинаковыми значениями полей до чтения значения автоинкрементного поля), понятное дело, ниже, чем вероятность двух вставок подряд вообще. но если необходима абсолютная уверенность в корректности считанного значения автоинкрементного поля, то либо блокировать таблицы(грубое решение "в лоб"), либо при вставке в таблицу вставлять туда же некое предварительно запомненное достаточно длинное (псевдо)случайное число/строку. В последнем случае, даже две абсолютно одинаковые с точки зрения модели записи(например, два Иванова Петра Сидоровича с одинаковой датой рождения) будут отличаться на значение поля со случайной величиной.
P.S. Ну, и вариант для извращенцев: отказаться от автоинкремента в пользу набора самостоятельно генерируемых на стороне клиента набора (псевдо)случайных чисел для использования в качестве ключа smile Тогда уже до вставки записи будет известен ключ записи.  smile 
PM MAIL   Вверх
Feldmarschall
Дата 15.12.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



Цитата(skyboy @  15.12.2007,  12:17 Найти цитируемый пост)
никто не может гарантировать, что после вставки записи до чтения соотвествующего значения автоинкремента не произойдет вставка 

может. MySQL гарантирует. если пользоваться её инструментами.
в API есть дажа функция специальная, mysql_insert_id
PM   Вверх
skyboy
Дата 15.12.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Feldmarschall @  15.12.2007,  11:20 Найти цитируемый пост)
в API есть дажа функция специальная, mysql_insert_id

зачем тогда выбирать запись из таблицы? если на момент вызова значение, возвращаемое last_insert_id, корректно(в смысле, этим же клиентом в пределах этого же подключения больше не производились вставки строк в таблицы с автоинкрементными полями) - то почему бы просто не вызывать last_insert_id()? я же говорил о схеме, когда вставили запись, потом считали запись(надеясь, что она - именно та, которую мы записали) и из неё вынули значение автоинкрементного поля.

Добавлено через 2 минуты и 15 секунд
Цитата(Feldmarschall @  15.12.2007,  11:20 Найти цитируемый пост)
MySQL гарантирует

кстати, MySQL не гарантирует, что
Цитата(skyboy @  15.12.2007,  11:17 Найти цитируемый пост)
после вставки записи до чтения соотвествующего значения автоинкремента не произойдет вставка записи с такими же значениями полей

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

PM MAIL   Вверх
Feldmarschall
Дата 15.12.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



А я не знаю - зачем выбирать? кто говорит о выбирании последней записи из таблицы? Автор темы говорит об апдейте, а не о выборке.

если последние два абзаца написаны для того, чтобы объяснить мне, что mysql_insert_id(), вызванная через неделю после вставки, не вернет нужное значение, то я, как бы, в курсе, спасибо.

В остальном смысл поста мне неясен.
Вроде бы, у автора конкетная задача. Которая корректно решается с помощью mysql_insert_id() и апдейта. Что он, я полагаю, и делает.
Я сказал, что это наиоболее правильный способ. Что тут ещё обсуждать?
PM   Вверх
tot
Дата 29.12.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 25.12.2007

Репутация: нет
Всего: нет



Цитата(Feldmarschall @ 15.12.2007,  13:20)
Вроде бы, у автора конкетная задача. Которая корректно решается с помощью mysql_insert_id() и апдейта. Что он, я полагаю, и делает.
Я сказал, что это наиоболее правильный способ. Что тут ещё обсуждать?

А вот я mysql_insert_id() не нахожу корректных. mysql_insert_id() корректен в пределах одного подключения, а если на одном подключении несколько пользователей(например Web-приложение), тогда между вставкой в запись и вызовом mysql_insert_id() может произойти еще одна вставка и результат вызова  mysql_insert_id()  будет уже не тем что ожидается.
PM MAIL   Вверх
vi_k
Дата 30.12.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.12.2007

Репутация: нет
Всего: нет



Цитата

Задача: получить значение автоинкремента в таблице ДО вставки записи (так что mysql_insert_id не подходит)


SHOW TABLE STATUS ...

Это ответ на заданный вопрос.

Но также считаю, что расчитывать, что ваша запись будет при вставке иметь именно этот id нельзя. Только вставка записи и последующее получение LAST_INSERT_ID может что-либо гарантировать.

Цитата

mysql_insert_id() корректен в пределах одного подключения, а если на одном подключении несколько пользователей(например Web-приложение), тогда между вставкой в запись и вызовом mysql_insert_id() может произойти еще одна вставка и результат вызова  mysql_insert_id()  будет уже не тем что ожидается.


В задачах такого плана параллельные работы на одном соединении должны быть запрещены. Хотя не представляю как вообще возможна параллельное использование соединения. Если вы сейчас говорите о mysql_pconnect() из php, то эта функция действительно берёт уже готовое ранее использовавшееся подключение, но, имхо конечно, php никому его не передаёт, пока скрипт не выполнится, поэтому параллельное использование этого соединения не допускается и можно безбоязненно использовать mysql_insert_id().

Это сообщение отредактировал(а) vi_k - 30.12.2007, 11:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1242 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.