Как получить следующий идентификатор автоинкремента в MySQL - PullRequest
97 голосов
/ 20 июля 2011

Как получить следующий идентификатор в MySQL, чтобы вставить его в таблицу

INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))

Ответы [ 19 ]

236 голосов
/ 19 сентября 2012

Вы можете использовать

SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;

или если вы не хотите использовать information_schema, вы можете использовать это

SHOW TABLE STATUS LIKE 'table_name'
46 голосов
/ 20 июля 2011

Вы можете получить значение next с автоинкрементом, выполнив:

SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'

Обратите внимание, что вы должны не использовать это, чтобы изменить таблицу, используйте столбец auto_increment, чтобы сделать это автоматически вместо этого.
Проблема в том, что last_insert_id() является ретроспективным и поэтому может быть гарантировано в текущем соединении.
Этот ребенок перспективен и, следовательно, не является уникальным для каждой связи и на него нельзя положиться.
Только в одной базе данных соединений это будет работать, но сегодня у отдельных баз данных соединений есть привычка превращаться в несколько баз данных соединений.

См .: SHOW TABLE STATUS

11 голосов
/ 20 июля 2011

Используйте LAST_INSERT_ID() из вашего SQL-запроса.

Или

Вы также можете использовать mysql_insert_id(), чтобы получить его с помощью PHP.

10 голосов
/ 04 января 2014

В верхнем ответе для решения используется PHP MySQL_ , но я поделюсь обновленным решением PHP MySQLi_ для достижения этой цели. В этом примере нет ошибок!

$db = new mysqli('localhost', 'user', 'pass', 'database');
$sql = "SHOW TABLE STATUS LIKE 'table'";
$result=$db->query($sql);
$row = $result->fetch_assoc();

echo $row['Auto_increment'];

Выбирает следующий Автоинкремент, появляющийся в таблице.

9 голосов
/ 14 октября 2016

Это вернет значение автоинкремента для базы данных MySQL, и я не проверял другие базы данных.Обратите внимание, что если вы используете любую другую базу данных, синтаксис запроса может быть другим.

SELECT AUTO_INCREMENT 
FROM information_schema.tables
WHERE table_name = 'your_table_name'
     and table_schema = database();
9 голосов
/ 19 августа 2012

В PHP вы можете попробовать это:

$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;

ИЛИ

$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
6 голосов
/ 09 июля 2012

Решение:

CREATE TRIGGER `IdTrigger` BEFORE INSERT ON `payments`
  FOR EACH ROW
BEGIN

SELECT  AUTO_INCREMENT Into @xId
    FROM information_schema.tables
    WHERE 
    Table_SCHEMA ="DataBaseName" AND
    table_name = "payments";

SET NEW.`payment_code` = CONCAT("sahf4d2fdd45",@xId);

END;

«DataBaseName» - это название нашей базы данных

4 голосов
/ 16 декабря 2015

Простой запрос сделает SHOW TABLE STATUS LIKE 'table_name'

4 голосов
/ 20 июля 2011

Вы можете использовать mysql триггер

3 голосов
/ 05 января 2014

Предлагаю переосмыслить то, что вы делаете. Я никогда не испытывал ни одного случая использования, когда требуются эти специальные знания. Следующий идентификатор - это особая деталь реализации, и я бы не стал рассчитывать, что он безопасен для ACID.

Сделайте одну простую транзакцию, которая обновит вставленную строку с последним идентификатором:

BEGIN;

INSERT INTO payments (date, item, method)
     VALUES (NOW(), '1 Month', 'paypal');

UPDATE payments SET payment_code = CONCAT("sahf4d2fdd45", LAST_INSERT_ID())
     WHERE id = LAST_INSERT_ID();

COMMIT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...