Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Манипуляция автоинкрементным полем  [new]
ambasador
Member

Откуда:
Сообщений: 79
Приветствую участников форума!

Разбираюсь с подходом DDD в веб-разработке, так вот, интересует генерация auto_increment поля для создания сущностей. Если к примеру репозиторий конкретной сущности который инициализируется с PDO инстансом имеет метод ::nextIdentity() который берет текущее значение auto_increment, обновляет инкрементом и возвращает то которое изначально было при выборке.
На основе этого два запроса:
-- 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
...


Какие будут комментарии к этому механизму.

Сообщение было отредактировано: 8 фев 20, 13:36
6 фев 20, 12:05    [22074514]     Ответить | Цитировать Сообщить модератору
 Re: Re: статистика посещений проектирование базы  [new]
miksoft
Member

Откуда:
Сообщений: 38000
ambasador,

Две параллельно работающие сессии могут получить одинаковый номер. Вас это устраивает?
И почему не хотите использовать стандартную механику автоинкремента?
6 фев 20, 12:47    [22074575]     Ответить | Цитировать Сообщить модератору
 Re: Re: статистика посещений проектирование базы  [new]
ambasador
Member

Откуда:
Сообщений: 79
miksoft,
автор
Две параллельно работающие сессии могут получить одинаковый номер. Вас это устраивает?

Так а транзакции вроде решают этот момент?

автор
И почему не хотите использовать стандартную механику автоинкремента?

Можно здесь поподробнее не совсем понятно, просто инсертить без явного указания id?
6 фев 20, 15:07    [22074821]     Ответить | Цитировать Сообщить модератору
 Re: статистика посещений проектирование базы  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 974
ambasador
miksoft,
автор
Две параллельно работающие сессии могут получить одинаковый номер. Вас это устраивает?

Так а транзакции вроде решают этот момент?

- ничто не мешает сделать select конкурентно. Они не подерутся.
- вы не запихнёте alter table в транзакцию.
6 фев 20, 15:28    [22074860]     Ответить | Цитировать Сообщить модератору
 Re: Re: статистика посещений проектирование базы  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20016
ambasador
транзакции вроде решают этот момент?
Нет. Этот, да ещё в показанном варианте - однозначно нет.
6 фев 20, 15:42    [22074876]     Ответить | Цитировать Сообщить модератору
 Re: Re: статистика посещений проектирование базы  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20016
Если задача - зарезервировать запись и вернуть её ID - нет ничего проще чем просто вставить пустую запись (заполнив NOT NULL поля, не имеющие дефолтного значения) и получить её ID.
6 фев 20, 15:44    [22074882]     Ответить | Цитировать Сообщить модератору
 Re: Re: статистика посещений проектирование базы  [new]
ambasador
Member

Откуда:
Сообщений: 79
Melkij
вы не запихнёте alter table в транзакцию

с этим понятно

Akina
Если задача - зарезервировать запись и вернуть её ID - нет ничего проще чем просто вставить пустую запись (заполнив NOT NULL поля, не имеющие дефолтного значения) и получить её ID.

А это идея! А как вообще получают id вставленной записи через LAST_INSERT_ID() или через information_schema?
6 фев 20, 16:11    [22074912]     Ответить | Цитировать Сообщить модератору
 Re: Re: статистика посещений проектирование базы  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20016
ambasador
как вообще получают id вставленной записи через LAST_INSERT_ID() или через information_schema?
INFORMATION_SCHEMA в этом вопросе - вообще не помощник.
LAST_INSERT_ID() - применим ограниченно, ибо работает только при вставке одной записи, только сразу после вставки, и только в том же соединении (даже если соединение восстановлено - всё, привет...).

Правильный подход такой - ты же знаешь, что именно только что вставил? вот и сделай SELECT с теми же значениями как условиями отбора - получишь свой ID. Причём если надо - сразу для нескольких записей, в любой момент, на пуле соединений, и вообще...
6 фев 20, 16:53    [22074955]     Ответить | Цитировать Сообщить модератору
 Re: Re: статистика посещений проектирование базы  [new]
ambasador
Member

Откуда:
Сообщений: 79
Ясно, благодарю за развернутый ответ!
6 фев 20, 17:51    [22075019]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить