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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> узнать id, которого нет перед созданием записи 
V
    Опции темы
pythonwin
Дата 12.3.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

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



Всем привет!
помогите, пожалуйста, как можно узнать id в таблице, которого нет перед созданием записи перед созданием этой таблице?

PM WWW GTalk Jabber   Вверх
skyboy
Дата 13.3.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



потенциально - никак. между проверкой "следующего значения id" и вставкой записи вполне может вклиниться вставка записи другим клиентом. Потому - лучше получать значение сгенерированного autoincrement-поля уже после вставки при помощи SQL-функции LAST_INSERT_ID. Замечу, что функция возвращает последнее сгенерированное для текущей сессии autoincrement-значение. т.е. если ты не закрываешь соединение с БД сразу после выполнения запроса, то ты получишь именно "свое" значение. коллизия со значениями от записей, вставленных другими клиентами, невозможна: ты получишь только свое.
PM MAIL   Вверх
pythonwin
Дата 13.3.2008, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

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



Цитата(skyboy @  13.3.2008,  03:25 Найти цитируемый пост)
между проверкой "следующего значения id" и вставкой записи вполне может вклиниться вставка записи другим клиентом.

спасибо - учту, но  данном случае у меня доступ монопольный - больше никого нет
PM WWW GTalk Jabber   Вверх
Serkys
Дата 13.3.2008, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

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



Нельзя получить id записи до вставки её. Можно получить id_последней_записи+1, но это тупиковый путь - возможна рассинхронизация БД.
PM MAIL   Вверх
igorold
Дата 13.3.2008, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

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



Я делаю так:

Код

select t1.BaseNumber+1 FROM DBNums t1 left join DBNums t2 on t1.SystemType=t2.SystemType 
and t2.BaseNumber=t1.BaseNumber+1 WHERE t1.BaseNumber>2000 and 
(t1.SystemType=1 OR t1.SystemType=4 OR t1.SystemType>6) 
and t2.BaseNumber is null order by t1.BaseNumber limit 1 


этот запрос находит "дырку" в индексах, но при этом обязательно д.б. запись с ID=1

Добавлено через 6 минут и 1 секунду
но на большой базе это будет достаточно долго отрабатывать ...  smile 


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
skyboy
Дата 13.3.2008, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Serkys @  13.3.2008,  06:38 Найти цитируемый пост)
Можно получить id_последней_записи+1, но это тупиковый путь - возможна рассинхронизация БД. 

не обязательно использовать решение, которое настолько "в лоб". можно получить `information_schema`.`tables`.`auto_increment` + 1. но по причинам, указанным выше, теряем гибкость. 
pythonwin, задумайся: стоит ли использовать auto_increment? если тебе не нужен механизм автоинддексирования и значения тебе надо ещё до вставки. не проще ли тебе будет реализовать счетчик за счет отдельной таблицы(типа information_schema.table) и триггера на вставку/хранимой функции?
PM MAIL   Вверх
igorold
Дата 13.3.2008, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

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



skyboy, а где написано, что это поле auto_increment ?


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
skyboy
Дата 13.3.2008, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(igorold @  13.3.2008,  07:34 Найти цитируемый пост)
а где написано, что это поле auto_increment ? 

нигде. а в отношении чего ещё может иметь смысл фраза "получить id до вставки в таблицу"? 0_о
PM MAIL   Вверх
igorold
Дата 13.3.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

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



обычно такие поля делают автоинкрементными, но тогда зачем pythonwin-у париться насчет ID, если оно и без него будет увеличиваться ... 

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


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
pythonwin
Дата 21.3.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

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



Цитата(igorold @  13.3.2008,  12:04 Найти цитируемый пост)
но тогда зачем pythonwin-у париться насчет ID

 поле автоинкрементное, но это мне нужно для всязи с другими таблицами

PM WWW GTalk Jabber   Вверх
bars80080
Дата 21.3.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



pythonwin, +1

у меня тоже был такой случай (если я правильно понял)

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

что интересно скажете?
PM MAIL WWW   Вверх
Бонифаций
Дата 23.3.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bars80080 @  21.3.2008,  14:25 Найти цитируемый пост)
но вот как узнать id именно этой записи?


Уже отвечали - last_insert_id


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
bars80080
Дата 24.3.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



вай, проморгал

тогда такой вопрос, я как понял в случае теоретической работы одновременно нескольких человек, т.е. одновременной вставки значений двумя пользователями перехлёста не будет? 

Цитата
The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions. 


здесь возвращается значение своего последнего id или просто значение максимального id?

Это сообщение отредактировал(а) bars80080 - 24.3.2008, 13:27
PM MAIL WWW   Вверх
Бонифаций
Дата 24.3.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



перехлеста не будет. Возвращается ид последней записи добавленной  в этой сессии


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
Feldmarschall
Дата 24.3.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



bars80080, ни то ни другое.
возвращается значение иднтификатора, которое сгенерилось твоим предыдущим запросом. не важно - первое оно, последнее или минимальное. 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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