Как получить последнее значение автоматического прироста PHP / MySql [duplicate]

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

- meta: flush_handlers

Пример, взятый из документации ansible :

tasks:
   - shell: some tasks go here
   - meta: flush_handlers
   - shell: some other tasks

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

89
задан Markus Malkusch 8 January 2014 в 18:08
поделиться

18 ответов

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

Или

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

14
ответ дан Sarfraz 27 August 2018 в 21:31
поделиться

Вам нужно подключиться к 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"];  
2
ответ дан Andrew Barber 27 August 2018 в 21:31
поделиться

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

SELECT AUTO_INCREMENT 
FROM information_schema.tables
WHERE table_name = 'your_table_name'
     and table_schema = database();
8
ответ дан Chaminda Bandara 27 August 2018 в 21:31
поделиться

В верхнем ответе используется 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
ответ дан Hexchaimen 27 August 2018 в 21:31
поделиться

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

Если вам действительно нужен ваш платежный_код, чтобы иметь идентификатор в нем, то ОБНОВЛЯЙТЕ строку после вставить для добавления идентификатора.

3
ответ дан Jacob 27 August 2018 в 21:31
поделиться

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

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

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;
2
ответ дан Markus Malkusch 27 August 2018 в 21:31
поделиться
mysql_insert_id();

Вот и все:)

1
ответ дан MPelletier 27 August 2018 в 21:31
поделиться

В 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'];
9
ответ дан Naresh Jain 27 August 2018 в 21:31
поделиться

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

4
ответ дан Nick Pavluk 27 August 2018 в 21:31
поделиться

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

0
ответ дан Olivier 27 August 2018 в 21:31
поделиться

, используя ответ 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'
);
0
ответ дан Paulo A. Costa 27 August 2018 в 21:31
поделиться

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

3
ответ дан Raa 27 August 2018 в 21:31
поделиться

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

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

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

SHOW TABLE STATUS LIKE 'table_name'
217
ответ дан ravi404 27 August 2018 в 21:31
поделиться

используйте «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
ответ дан sagarchavda 27 August 2018 в 21:31
поделиться

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

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

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

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

3
ответ дан Stephen Senkomago Musoke 27 August 2018 в 21:31
поделиться
SELECT id FROM `table` ORDER BY id DESC LIMIT 1

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

1
ответ дан Tebe 27 August 2018 в 21:31
поделиться

Решение:

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

6
ответ дан Tisho 27 August 2018 в 21:31
поделиться

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

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

35
ответ дан Vlad Schnakovszki 27 August 2018 в 21:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: