![]() |
|
Модераторы: skyboy |
![]()
|
|
| pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: нет Всего: 36 |
Всем привет!
помогите, пожалуйста, как можно узнать id в таблице, которого нет перед созданием записи перед созданием этой таблице? |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
потенциально - никак. между проверкой "следующего значения id" и вставкой записи вполне может вклиниться вставка записи другим клиентом. Потому - лучше получать значение сгенерированного autoincrement-поля уже после вставки при помощи SQL-функции LAST_INSERT_ID. Замечу, что функция возвращает последнее сгенерированное для текущей сессии autoincrement-значение. т.е. если ты не закрываешь соединение с БД сразу после выполнения запроса, то ты получишь именно "свое" значение. коллизия со значениями от записей, вставленных другими клиентами, невозможна: ты получишь только свое.
|
|||
|
||||
| pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: нет Всего: 36 |
||||
|
||||
| Serkys |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1061 Регистрация: 19.4.2004 Репутация: нет Всего: 22 |
Нельзя получить id записи до вставки её. Можно получить id_последней_записи+1, но это тупиковый путь - возможна рассинхронизация БД.
|
|||
|
||||
| igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 5 Всего: 17 |
Я делаю так:
этот запрос находит "дырку" в индексах, но при этом обязательно д.б. запись с ID=1 Добавлено через 6 минут и 1 секунду но на большой базе это будет достаточно долго отрабатывать ... -------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
не обязательно использовать решение, которое настолько "в лоб". можно получить `information_schema`.`tables`.`auto_increment` + 1. но по причинам, указанным выше, теряем гибкость. pythonwin, задумайся: стоит ли использовать auto_increment? если тебе не нужен механизм автоинддексирования и значения тебе надо ещё до вставки. не проще ли тебе будет реализовать счетчик за счет отдельной таблицы(типа information_schema.table) и триггера на вставку/хранимой функции? |
|||
|
||||
| igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 5 Всего: 17 |
skyboy, а где написано, что это поле auto_increment ?
-------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
||||
|
||||
| igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 5 Всего: 17 |
обычно такие поля делают автоинкрементными, но тогда зачем pythonwin-у париться насчет ID, если оно и без него будет увеличиваться ...
т.е. поле не обязательно автоинкрементное, но оно должно быть уникальным и видимо не должно быть пропусков значений этого ID ... -------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| pythonwin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2529 Регистрация: 18.4.2006 Где: за компом Репутация: нет Всего: 36 |
поле автоинкрементное, но это мне нужно для всязи с другими таблицами |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 5 Всего: 315 |
pythonwin, +1
у меня тоже был такой случай (если я правильно понял) после вставки в таблицу записи, требовалось скинуть ссылку для других таблиц, и естесственно лучше всего скинуть id но вот как узнать id именно этой записи? единственный вариант, произвести после этого выборку where совпадают все остальные поля но ведь легко может оказаться не одна такая запись что интересно скажете? |
|||
|
||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 20 Всего: 40 |
Уже отвечали - last_insert_id -------------------- Бонифаций. |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 5 Всего: 315 |
вай, проморгал
тогда такой вопрос, я как понял в случае теоретической работы одновременно нескольких человек, т.е. одновременной вставки значений двумя пользователями перехлёста не будет?
здесь возвращается значение своего последнего id или просто значение максимального id? Это сообщение отредактировал(а) bars80080 - 24.3.2008, 13:27 |
|||
|
||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 20 Всего: 40 |
перехлеста не будет. Возвращается ид последней записи добавленной в этой сессии
-------------------- Бонифаций. |
|||
|
||||
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 3 Всего: 32 |
bars80080, ни то ни другое.
возвращается значение иднтификатора, которое сгенерилось твоим предыдущим запросом. не важно - первое оно, последнее или минимальное. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |