Как получить следующий идентификатор автоматического приращения в mysql



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



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

18 ответов:

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

или

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

можно использовать

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

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

SHOW TABLE STATUS LIKE 'table_name'

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

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() является ретроспективным и, таким образом, может быть гарантировано в текущем соединении.
Этот ребенок является перспективным и поэтому не является уникальным для каждого соединения и не может быть положен.
Только в одной базе данных связи будет ли это работать, но базы данных с одним соединением сегодня имеют привычку становиться несколькими базами данных соединений завтра.

в 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'];

в верхнем ответе используется 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'];

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

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

SELECT AUTO_INCREMENT 
FROM information_schema.tables
WHERE table_name = 'your_table_name'
     and table_schema = database();

устранение:

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" - это имя нашей базы данных

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

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

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

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

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

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

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

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

вы должны подключиться к 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"];  

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

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

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;

использовать "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());
    ?>

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

mysql_insert_id();

вот именно :)

SELECT id FROM `table` ORDER BY id DESC LIMIT 1

хотя я сомневаюсь в его продуктивности, но это 100% Надежный

используя ответ рави404:

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. бывший.:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( getAutoincrementalNextval ('document') ),
    'Title',
    'Body'
);

улучшение @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): DB engine, кажется, alwaus рассматривает смещение 1. Поэтому вам нужно отбросить это предположение, а затем добавить необязательное значение @@auto_increment_offset или по умолчанию 1: IFNULL (@@auto_increment_offset,1)

Comments

    Ничего не найдено.