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

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

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

Ответы [ 19 ]

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

Вы не можете использовать идентификатор при вставке, и при этом он вам не нужен. MySQL даже не знает идентификатор, когда вы вставляете эту запись. Вы можете просто сохранить "sahf4d2fdd45" в таблице payment_code и позже использовать id и payment_code.

Если вам действительно нужен код payment_code, чтобы в нем был идентификатор, тогда ОБНОВИТЕ строку после вставки, чтобы добавить идентификатор.

3 голосов
/ 09 июля 2012

Зачем вам нужен следующий инкрементный идентификатор?

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

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

Я бы посоветовал вам пересмотреть свой проект, чтобы убедиться, что вам не нужно знать, какие автоматическиезначение приращения для назначения следующего

2 голосов
/ 07 апреля 2014

используйте "mysql_insert_id ()". mysql_insert_id () действует на последний выполненный запрос, обязательно вызовите mysql_insert_id () сразу после запроса, который генерирует значение.

Ниже приведен пример использования:

<?php
    $link = mysql_connect('localhost', 'username', 'password');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');

mysql_query("INSERT INTO mytable  VALUES('','value')");
printf("Last inserted record has id %d\n", mysql_insert_id());
    ?>

Надеюсь, приведенный выше пример полезен.

2 голосов
/ 15 ноября 2011

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

$table_name = "myTable"; 
$query = mysql_query("SHOW TABLE STATUS WHERE name='$table_name'"); 
$row = mysql_fetch_array($query); 
$next_inc_value = $row["AUTO_INCREMENT"];  
1 голос
/ 27 октября 2016

используя ответ ravi404:

CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
    RETURNS BIGINT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

    DECLARE Value BIGINT;

    SELECT
        AUTO_INCREMENT INTO Value
    FROM
        information_schema.tables
    WHERE
        table_name = TableName AND
        table_schema = DATABASE();

    RETURN Value;

END

используется в вашем запросе вставки, чтобы создать хэш SHA1. ex.:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( getAutoincrementalNextval ('document') ),
    'Title',
    'Body'
);
1 голос
/ 21 августа 2015
SELECT id FROM `table` ORDER BY id DESC LIMIT 1

Хотя я сомневаюсь в его производительности, но он на 100% надежен

1 голос
/ 23 августа 2014
mysql_insert_id();

Вот и все:)

0 голосов
/ 18 января 2019

Для меня это работает, и выглядит просто:

 $auto_inc_db = mysql_query("SELECT * FROM my_table_name  ORDER BY  id  ASC ");
 while($auto_inc_result = mysql_fetch_array($auto_inc_db))
 {
 $last_id = $auto_inc_result['id'];
 }
 $next_id = ($last_id+1);


 echo $next_id;//this is the new id, if auto increment is on
0 голосов
/ 15 мая 2018

Улучшение @ ravi404, если смещение автоинкремента НЕ равно 1:

SELECT (`auto_increment`-1) + IFNULL(@@auto_increment_offset,1) 
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = your_table_name
AND table_schema = DATABASE( );

(auto_increment -1): кажется, что движок дБ всегда учитывает смещение 1. Поэтому вам необходимо отказатьсяВ этом предположении добавьте необязательное значение @@ auto_increment_offset или значение по умолчанию 1: IFNULL (@@ auto_increment_offset, 1)

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