Pdo, postgresql, lastinsertid

AnrDaemon

Продвинутый новичок
Проблема с Auto_Increment (auto_increment = max(id)) только в mysql(innodb) или в postgre такая же история?
Проблема не "в", проблема принципиальная и заключается в слове "auto".
Ведь мы создавая SEQUENCE указываем INCREMENT BY 1. Тоже ведь тоже auto_increment?
С сиквенсом ты всегда можешь вручную запросить следующее значение, гарантированно получив в своё пользование уникальный элемент последовательности, который больше не получит никто, и для этого не надо лезть в другие данные.
 

WMix

герр M:)ller
Партнер клуба
С сиквенсом ты всегда можешь вручную запросить следующее значение, гарантированно получив в своё пользование уникальный элемент последовательности, который больше не получит никто, и для этого не надо лезть в другие данные.
проблема лишь в изменении состояния (запись) и считывания результата (чтение). получить новую секвенцию можно не меняя состояния (только читаем). а считать новый id во время изменения состояния это и писать, и читать. атомарны же оба подхода
 

Adelf

Administrator
Команда форума
Вот уж не думал, что на такую довольно тривиальную тему как секвенсы, можно развернуть такую дискуссию :)
можно просто представить себе числовой ключ в редисе и команду incr. Все.
 

AnrDaemon

Продвинутый новичок
проблема лишь в изменении состояния (запись) и считывания результата (чтение).
Изменении состояния ЧЕГО? Считывании результата ЧЕГО?
получить новую секвенцию можно не меняя состояния (только читаем).
Это будет строго информативная операция, непригодная ни для какого использования, кроме статистического.
а считать новый id во время изменения состояния это и писать, и читать. атомарны же оба подхода
Разница в том, что сиквенсы по определению ПОСЛЕДОВАТЕЛЬНЫ. Тогда как auto_increment всего лишь ИНКРЕМЕНТАЛЕН.
Т.е. каждое следующее значения больше предыдущего, но не факт, что на единицу. Может и на сотню (REPLACE INTO …(100 строк за раз)).
 

WMix

герр M:)ller
Партнер клуба
Изменении состояния ЧЕГО? Считывании результата ЧЕГО?
данных
просто отделить команду от запроса
Разница в том, что сиквенсы по определению ПОСЛЕДОВАТЕЛЬНЫ. Тогда как auto_increment всего лишь ИНКРЕМЕНТАЛЕН.
и че? результат разный или не потребный? какая разница на сколько он (счетчик) сдвинулся, если оба варианта гарантируют уникальность, ну 100500 будет и че?
 

AnrDaemon

Продвинутый новичок
Даже 64-битный INT имеет дурацкую привычку переполняться.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Adelf, у меня пока максималка была в пару лярдов записей, и то это была моя ошибка в проектировании.
 

AnrDaemon

Продвинутый новичок
У меня нет, а вот логи транзакций в Еве уже раза четыре укорачивали.
 

Adelf

Administrator
Команда форума
ну тут разговор про id для сущности. логам то зачем? им там можно генерить чтото попроще. datatime+something
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
проблема лишь в изменении состояния (запись) и считывания результата (чтение). получить новую секвенцию можно не меняя состояния (только читаем). а считать новый id во время изменения состояния это и писать, и читать. атомарны же оба подхода
цитата-кличко-2.jpg


перечитав 4 раза, смыл я понять не смог
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
@WMix, ты нас извини, но возникает желание задать вопрос - "что ты куришь?"

Тебя не затруднит пояснить свою мысль на примерах? А то тебя не понимают уже двое… и мне кажется, это только начало.
 

fixxxer

К.О.
Партнер клуба
@WMix, я тоже не понял.
Любой сиквенс это по определению stateful штука. Так что ясен фиг, что "проблема" с тем, что есть сайд-эффекты (капитан!). А вторую часть я тоже не осилил.
 

WMix

герр M:)ller
Партнер клуба
Сам sequence конечно имеет состояние.

Любая программа это состояние данных и инпут. Данные мы храним в базе. Изменение состояния это insert ( ну и сейчас не интересные update/delete). Select и last insert id это считывание.
А Команда (то что изменяет состояние) ничего не возвращает.
Если пользоваться autoincrement то новый индентификатор получаешь постфактум, что заставляет на команду ответить этим новым индефикатором.

Назовите вы плюсы секвенции если это не об этом.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ответ от прапорщика: https://ru.wikipedia.org/wiki/Spinlock

Любая программа - это состояние, события, и обработка. Обрабатывают процессоры. У процессоров есть атомарные операции.
У последовательности (секвенция - в музыке) состояния нет. Состояние есть у ячейки памяти.
Последовательность в SQL - это синтаксис для атомарного перебора целых чисел.
В рамках int64 можно задать диапазон, увеличение или уменьшение, шаг, зацикленность.

Результат атомарного перебора можно исползовать как иДЕНТИфикатор сущности в программе. Можно не использовать.
Можно использовать значение одной последовательности в нескольких однородных сущностях - я так делаю иногда. Например, ID внутренних и внешних транзакций у меня из одной последовательности.
У последовательности может быть глобальная область видимости, или только для текущего соединения.
Можно не записывать результат перебора в базу, а использовать в хранимых процедурах.

С автоинкрементом доступа к атомарной операции нет. Можно только увеличить внутреннюю переменную, и записать результат в поле главного ключа таблицы.
 
Сверху