[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ON DUPLICATE KEY UPDATE и auto increment
Страницы: 1, 2
sergeiss
Цитата (Zzepish @ 3.06.2015 - 20:15)
Иногда хочется, чтоб нумерация была ровная у статей, напрмер. В противном случае для этого придется допиливать доп. код

А не надо опираться на автоинкрементные айдишники. Лучше вообще айдишники статей делать безо всякой привязки к местоположению данных в БД. Например по дате или еще как-то.
Иначе получается, что ты сам себе создаешь проблемы, которые потом пытаешься решить геройскими методами.

Цитата (acerrusm @ 3.06.2015 - 12:51)
Почему так происходит, и как избавится от таких ненужных скачков в auto increment?

Поверь - это очень нужные скачки smile.gif Если бы не они, то при хорошей нагрузке, при одновременном обращении к БД, ты бы получил очень плохую проблему, которую нельзя разрешить автоматически.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
acerrusm
Цитата (Valick @ 3.06.2015 - 19:12)
acerrusm, зачем надо доставать id_user если такой имейл уже существует?

Для практики по MVC получил задание написать систему заказа фильмов в кинотеатре. Задание было немного упрощено, а именно вместо полноценной регистрации в конце нужно просто ввести свой мейл и имя. Если человек с таким мейлом когда то уже делал заказ, то создавать его заново нет смысла. Но нужно получить тогда его user_id что бы потом прописать в другой таблице reservations (в нее сохраняется user_id, ряд, место, дата, и номер программы). В случае если юзера еще нет в таблице users, то его нужно в нее запихнуть, и опять же вернуть его user_id для заполнения той же таблиц reservations.

PS. задание выполнил, поставили 4 — не спроектировал сайт на бумаге blink.gif

Но решить вопрос с БД для себя все же хочется
Valick
acerrusm, так сделай обычный селект, а если такого имейла нет, то уже тогда инсерт.


_____________
Стимулятор ~yoomoney - 41001303250491
acerrusm
Цитата (Valick @ 3.06.2015 - 22:02)
acerrusm, так сделай обычный селект, а если такого имейла нет, то уже тогда инсерт.

Да, странно что я так сразу не сделал.

Однако в случае с iNSERT мне все равно придется доставать user_id добавленного пользователя при помощи LAST_INSERT_ID. Выше stump сделал замечание по этому поводу:
Цитата
А если твой юзер был добавлен первым, а после него еще сотня. И тогда LAST_INSERT_ID(user_id) = 101, а юзер который обладает добавляемыми тобою user_name, user_email добавлен первым? Как быть?

Тогда придется сохранить мейл добавленного юзера в переменную, а потом сделать еще один SELECT что бы получить его user_id, но как тогда быть с выбранными пользователем мест в кинотеатре? За все время манипуляции с БД другие пользователи могут выбрать такие же места. Короче появилось еще больше вопросов. huh.gif

acerrusm
Хотя можно создать дополнительную таблицу где места будут временно резервироваться на определенный срок, скажем на 5 минут. Если в течении этого времени пользователь не совершит "оплату", то эти места освобождаются.
Похоже на все вопросы получил ответ. biggrin.gif

Всем спасибо за помощь!
Valick
Цитата
А если твой юзер был добавлен первым, а после него еще сотня. И тогда LAST_INSERT_ID(user_id) = 101, а юзер который обладает добавляемыми тобою user_name, user_email добавлен первым? Как быть?

а быть очень просто.. надо читать умные книжки (походу на эту фразу реагирует только один человек на форуме, да и тот не адекватно biggrin.gif )
LAST_INSERT_ID возвращается после инсёрта, и для каждого соединения он свой. Если вы вставили запись в БД под номером 5. то хоть миллион других пользователей всавят свои "5 копеек", вам LAST_INSERT_ID вернёт именно номер 5 и никаких 1000005

Цитата
За все время манипуляции с БД другие пользователи могут выбрать такие же места.

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

_____________
Стимулятор ~yoomoney - 41001303250491
Zzepish
S.Chushkin
да то я уже понял давно)))
acerrusm
Цитата (Valick @ 3.06.2015 - 22:31)
Цитата
А если твой юзер был добавлен первым, а после него еще сотня. И тогда LAST_INSERT_ID(user_id) = 101, а юзер который обладает добавляемыми тобою user_name, user_email добавлен первым? Как быть?

а быть очень просто.. надо читать умные книжки (походу на эту фразу реагирует только один человек на форуме, да и тот не адекватно biggrin.gif )
LAST_INSERT_ID возвращается после инсёрта, и для каждого соединения он свой. Если вы вставили запись в БД под номером 5. то хоть миллион других пользователей всавят свои "5 копеек", вам LAST_INSERT_ID вернёт именно номер 5 и никаких 1000005

Цитата
За все время манипуляции с БД другие пользователи могут выбрать такие же места.

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

Спасибо biggrin.gif
stump
Как вариант можно проверять существование заказа в таблице reservation сджоинив ее с табл юзер опираясь на-внешние данные email-а.

Если записи нет то делать все вставки insert.

Так можно делать потому как основная задача в резервации фильма.

_____________
Трус не играет в хокей
stump
Цитата (Valick @ 4.06.2015 - 01:31)
Цитата
А если твой юзер был добавлен первым, а после него еще сотня. И тогда LAST_INSERT_ID(user_id) = 101, а юзер который обладает добавляемыми тобою user_name, user_email добавлен первым? Как быть?

а быть очень просто.. надо читать умные книжки (походу на эту фразу реагирует только один человек на форуме, да и тот не адекватно biggrin.gif )
LAST_INSERT_ID возвращается после инсёрта, и для каждого соединения он свой. Если вы вставили запись в БД под номером 5. то хоть миллион других пользователей всавят свои "5 копеек", вам LAST_INSERT_ID вернёт именно номер 5 и никаких 1000005

Цитата
За все время манипуляции с БД другие пользователи могут выбрать такие же места.

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

Да, да. В случае если unique и выполняется условие on duplicate key то так работать и будет.

Подумал если отдельно запрашивать конструкцию LAST_INSERT_ID вне запроса.

_____________
Трус не играет в хокей
DedMorozzz
http://phpforum.su/index.php?showtopic=0&v...dpost&p=2444484

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.