MySQL + PHP: получение last_id множественного / составного первичного ключа - PullRequest
5 голосов
/ 25 августа 2011

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

  • В этих таблицах нет столбца AUTOCOUNT.
  • Я использую параметризованные запросы (в произвольном порядке)
  • Используя PHP (5.3) и модуль MySQLi
  • Произвольный запрос SQL INSERT.(В любом формате)

Например:

Table: foo
Primary key: [ group_id , user_id ]
Query: INSERT INTO foo (group_id, user_id, name, email) VALUES (?, ?, ?, ?);
Parameters: array(34,15,"John","john@example.com")

Результат: $ last_id = $ mysqli-> insert_id?: getInsertedId () ;

34,15

На данный момент у меня есть функция с именем getPK (), которая возвращает мне:

array("group_id","user_id");

Теперь мне нужно реализовать getInsertedId () .Что может быть простым способом сделать это без использования парсера SQL?

Я почти уверен, что ответ на этот вопрос уже есть, но я ничего не смог найти ...

ОБНОВЛЕНИЕ

Причина, по которой я задаю этот вопрос, заключается в том, что у меня есть класс, который контролирует все, что связано с базой данных MySQL (часть личной структуры).У меня есть один метод, который называется set () , в котором передаются запросы (например, UPDATE, INSERT, DELETE и т. Д.).У меня есть другие конкретные методы, такие как insert () , в которых передаются массивы.

У меня есть переменная, в которой я храню last_inserted_id.Эта переменная может быть вызвана в любое время позже.У меня есть много таблиц в разных системах, которые имеют несколько первичных ключей.При использовании метода insert () у меня нет проблем с установкой значения last_inserted_id, но когда некоторые системы используют метод set () , я не могу получить это значение, и у меня естьчтобы вернуть 0. Я хотел бы изменить это поведение.

Я хотел упростить свое объяснение с приведенным выше примером.

ОБНОВЛЕНИЕ 2

Невсе системы контролируются мной.Например, одна из систем вызывает метод мыла, в котором отправляется запрос на выполнение (любой вид запроса).Они обрабатываются методом set () .Тогда есть другой метод мыла, в котором извлекается последний идентификатор.Для согласованности я хотел бы вернуть это значение.

Ответы [ 2 ]

4 голосов
/ 25 августа 2011

Как отметил Фил в комментарии, MySQL LAST_INSERT_ID() может возвращать только автоматически сгенерированные значения (AUTO_INCREMENT).

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

В заключение, вы не можете вставить ключ, используя LAST_INSERT_ID() в вашем случае.

Решением будет обработать этот случай в PHP, чтобы метод getInsertedId () возвращал значения первичных ключей, которые были заданы для вставки.

0 голосов
/ 25 августа 2011

Вы можете добавить столбец Timestamp, который автоматически инициализируется к текущей отметке времени, когда запись INSERTED и не обновляется каждый раз при обновлении записи:

ALTER TABLE MyTable
  ADD COLUMN InsertTS TIMESTAMP DEFAULT CURRENT_TIMESTAMP
, ADD INDEX InsertTS_ind (InsertTS) ;

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

SELECT group_id, user_id
FROM MyTable
ORDER BY InsertTS DESC
LIMIT 1 ;

Примечание : вы можете сделать это , только если у вас еще нет отметки времени в таблице, которая получает автоматически инициализируемые и / или автоматически обновляемые значения.

...