Вложение LAST_INSERT_ID () в подготовленный оператор PDO? - PullRequest
0 голосов
/ 29 апреля 2020

Используя PHP с MySQL и подготовленными инструкциями PDO, я хотел бы имитировать c непрозрачный идентификатор простым, безопасным и эффективным способом. Идея состоит в том, чтобы добавить случайное значение к текущему значению LAST_INSERT_ID.

INSERT INTO table 
SET id = LAST_INSERT_ID( LAST_INSERT_ID() + FLOOR(1 + (RAND() * 99)) ), 
text = ?,
...

Внешнее выражение устанавливает идентификатор, внутренний вызов получает текущее значение и изменяет его. Это работает, как и ожидалось, когда я тестирую его с клиентом Sequel Pro. Однако в реальном скрипте с подготовленным оператором последний идентификатор вставки не обновляется / сохраняется. Итак, я получаю случайные идентификаторы, но они не суммируются.

Что мне не хватает?

1 Ответ

0 голосов
/ 30 апреля 2020

Это действительно не работает, и вот почему:

  • LAST_INSERT_ID () возвращает 0 при первом вызове для каждого соединения, потому что нет последней вставки. К сожалению, он не просто возвращает потенциальное следующее значение AUTO_INCREMENT.
  • Если вы разделите его на отдельные команды, сначала INSERT, а затем UPDATE в том же выражении, LAST_INSERT_ID () не будет обновляться между.
  • Более того, "если вы смешаете ссылки на LAST_INSERT_ID () и LAST_INSERT_ID (expr), эффект не определен" Вручную против Вручную
  • ОБНОВЛЕННЫЕ идентификаторы будут игнорироваться LAST_INSERT_ID ()
...