Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Манипуляция автоинкрементным полем / 9 сообщений из 9, страница 1 из 1
06.02.2020, 12:05
    #39923300
ambasador
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляция автоинкрементным полем
Приветствую участников форума!

Разбираюсь с подходом DDD в веб-разработке, так вот, интересует генерация auto_increment поля для создания сущностей. Если к примеру репозиторий конкретной сущности который инициализируется с PDO инстансом имеет метод ::nextIdentity() который берет текущее значение auto_increment, обновляет инкрементом и возвращает то которое изначально было при выборке.
На основе этого два запроса:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
-- get id into $currentValue variable
SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '<dbname>' AND TABLE_NAME = 'posts';

-- update id with increment $currentValue
ALTER TABLE posts AUTO_INCREMENT = $currentValue + 1; 

-- return $currentValue
...



Какие будут комментарии к этому механизму.
...
Рейтинг: 0 / 0
06.02.2020, 12:47
    #39923337
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляция автоинкрементным полем
ambasador,

Две параллельно работающие сессии могут получить одинаковый номер. Вас это устраивает?
И почему не хотите использовать стандартную механику автоинкремента?
...
Рейтинг: 0 / 0
06.02.2020, 15:07
    #39923464
ambasador
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляция автоинкрементным полем
miksoft,
авторДве параллельно работающие сессии могут получить одинаковый номер. Вас это устраивает?
Так а транзакции вроде решают этот момент?

авторИ почему не хотите использовать стандартную механику автоинкремента?
Можно здесь поподробнее не совсем понятно, просто инсертить без явного указания id?
...
Рейтинг: 0 / 0
06.02.2020, 15:28
    #39923486
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляция автоинкрементным полем
ambasador
miksoft,
авторДве параллельно работающие сессии могут получить одинаковый номер. Вас это устраивает?

Так а транзакции вроде решают этот момент?
- ничто не мешает сделать select конкурентно. Они не подерутся.
- вы не запихнёте alter table в транзакцию.
...
Рейтинг: 0 / 0
06.02.2020, 15:42
    #39923497
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляция автоинкрементным полем
ambasador
транзакции вроде решают этот момент?
Нет. Этот, да ещё в показанном варианте - однозначно нет.
...
Рейтинг: 0 / 0
06.02.2020, 15:44
    #39923503
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляция автоинкрементным полем
Если задача - зарезервировать запись и вернуть её ID - нет ничего проще чем просто вставить пустую запись (заполнив NOT NULL поля, не имеющие дефолтного значения) и получить её ID.
...
Рейтинг: 0 / 0
06.02.2020, 16:11
    #39923522
ambasador
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляция автоинкрементным полем
Melkijвы не запихнёте alter table в транзакцию
с этим понятно

AkinaЕсли задача - зарезервировать запись и вернуть её ID - нет ничего проще чем просто вставить пустую запись (заполнив NOT NULL поля, не имеющие дефолтного значения) и получить её ID.
А это идея! А как вообще получают id вставленной записи через LAST_INSERT_ID() или через information_schema?
...
Рейтинг: 0 / 0
06.02.2020, 16:53
    #39923552
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляция автоинкрементным полем
ambasador
как вообще получают id вставленной записи через LAST_INSERT_ID() или через information_schema?
INFORMATION_SCHEMA в этом вопросе - вообще не помощник.
LAST_INSERT_ID() - применим ограниченно, ибо работает только при вставке одной записи, только сразу после вставки, и только в том же соединении (даже если соединение восстановлено - всё, привет...).

Правильный подход такой - ты же знаешь, что именно только что вставил? вот и сделай SELECT с теми же значениями как условиями отбора - получишь свой ID. Причём если надо - сразу для нескольких записей, в любой момент, на пуле соединений, и вообще...
...
Рейтинг: 0 / 0
06.02.2020, 17:51
    #39923590
ambasador
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Манипуляция автоинкрементным полем
Ясно, благодарю за развернутый ответ!
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Манипуляция автоинкрементным полем / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]