2014-01-02 4 views
6

Я запускаю 1 скрипт в php для того, чтобы мне понадобился последний вставленный идентификатор в таблице подписки. Используя этот идентификатор, я хочу сделать уведомление для этой подписки.Как получить последний вставленный идентификатор из таблицы MySQL

я использовал:

SELECT LAST_INSERT_ID() FROM subscription 

Я получаю 0 вместо реального последнего вставленного значения.

+2

'LAST_INSERT_ID()' is * connection specific *. Убедитесь, что вы не закрываете соединение и не открываете новое сообщение между запросами или не пытаетесь вызвать эту функцию из отдельного сценария. – Sammitch

ответ

4

LAST_INSERT_ID() возвращает последний идентификатор из предыдущей инструкции вставки. Если вы хотите самый последнюю добавленную запись и с помощью Auto Increment Prime ключей, вы можете использовать код ниже:

SELECT MAX(id) FROM subscription; 

Если вам нужно знать, что СЛЕДУЮЩЕГО идентификатор будет, вы можете получить это от INFORMATION_SCHEMA

SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'test' 

mysql_insert_id

+1

+1, но 'MAX (id)' не обязательно близок к значению * next *, которое будет генерировать автоинкремент, потому что кто-то мог удалить некоторые строки из конца таблицы. –

+0

@BillKarwin OP не запрашивал, что будет * Next * id. –

+1

Да, точка взята, но все же возможно (хотя и редко), что 'LAST_INSERT_ID()' может вернуть значение выше MAX (id) ', если только что вставленная строка удалена. –

3

Этот вопрос уже был дан ответ много раз: MySQL: LAST_INSERT_ID() returns 0

Вы используете эту функцию вне контекста. Она будет работать только если вы вставили строку непосредственно перед Thusly:

INSERT INTO 'subscription' (name) VALUES ('John Smith'); 
SELECT LAST_INSERT_ID() FROM subscription 

Однако вы можете выбрать строку с наибольшим идентификатором, который логически было бы наиболее недавно добавил ...

SELECT MAX(id) FROM subscription; 

Однако стандартный подход состоит в том, чтобы просто вызвать mysqli_insert_id или mysql_insert_id (в зависимости от того, используете ли вы MySQL-библиотеку mysqli или mysql. Я должен добавить, что библиотека mysql очень нецелесообразна для использования, поскольку она почти полностью не рекомендуется). Вот то, что все это будет идеально выглядеть следующим образом:

$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 
$mysqli->query("INSERT INTO 'subscription' (name) VALUES ('John Smith');"); 
printf ("New Record has id %d.\n", $mysqli->insert_id); 
//Output is something like: New Record has id 999 

Однако, если вы не вставили подписку в том же сценарии, как собирать самую последнюю строку ID, используйте «SELECT MAX» подход. Это кажется маловероятным, учитывая, что вы упомянули «1 скрипт»

Кроме того, если ваши идентификаторы не являются последовательными, или вы не имеете поле ID, или у вас есть ряд идентификаторов выше, чем тот, который вы только что добавили вы должны вероятно, рассмотрим столбец «date_added», чтобы определить, какой из них действительно был последним. Однако эти сценарии маловероятны.

1

Это всегда даст вам максимальный идентификатор, который говорит, что наибольшее число является последним вставляется один

SELECT MAX(id) as MaximumID FROM subscription; 
+6

Да, это будет самое большое значение, но если другие сеансы также вставляются, то 'MAX (id)' не обязательно будет возвращать последнее значение, сгенерированное * вашей * сессией. –

+0

Я думаю, что ты прав. – Mubo

+0

Кроме того, если вы игнорируете 'auto_increment', вручную вставив значение' 10', когда самый большой идентификатор уже «100», ваш подход также завершится неудачно. –

7

Если вы используете php для подключения к mysql вы можете использовать mysql_insert_id(), чтобы указать на последний вставленный идентификатор.

Как это:

mysql_query("INSERT INTO mytable (1, 2, 3, 'blah')"); 
$last_id = mysql_insert_id(); 

Смотреть это: mysql_insert_id()

2

это лучший подход 2 и 3 работает, но MAX (ID) требуется больше времени для выполнения.

  1. SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'dbName' AND TABLE_NAME = 'tableName';

  2. SELECT tableName.id FROM tableName ORDER BY tableName.id DESC LIMIT 0,1;

  3. SELECT MAX(id) FROM tableName;

+1

Это решение должно использоваться с осторожностью, поскольку две (или более) параллельные транзакции могут получать одинаковое значение – hdvianna

1
$last_id=mysql_query("SELECT id FROM `table_name` ORDER BY id DESC LIMIT 0 , 1"); 
$row=mysql_fetch_assoc($last_id); 
echo $row['id']; 

Заменить id на свой идентификатор имя поля в базе данных и table_name по имени таблицы.

Смежные вопросы