Если вы хотите заставить обработчик работать между двумя задачами, а не в конце воспроизведения, вам нужно поставить это между двумя задачами:
- meta: flush_handlers
Пример, взятый из документации ansible :
tasks:
- shell: some tasks go here
- meta: flush_handlers
- shell: some other tasks
Обратите внимание, что это приведет к тому, что все отложенные обработчики будут выполняться в этой точке, а не только это конкретное.
Используйте LAST_INSERT_ID()
из вашего SQL-запроса.
Или
Вы также можете использовать mysql_insert_id()
, чтобы получить он использует PHP.
Вам нужно подключиться к 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"];
Это вернет значение автоматического прироста для базы данных MySQL, и я не проверял его с другими базами данных. Обратите внимание: если вы используете какую-либо другую базу данных, синтаксис запроса может быть различным.
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = database();
В верхнем ответе используется 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 даже не знает идентификатор, когда вы вставляете эту запись. Вы можете просто сохранить "sahf4d2fdd45"
в таблице payment_code
и позже использовать id
и payment_code
.
Если вам действительно нужен ваш платежный_код, чтобы иметь идентификатор в нем, то ОБНОВЛЯЙТЕ строку после вставить для добавления идентификатора.
Я предлагаю переосмыслить то, что вы делаете. Я никогда не испытывал один случай использования, когда требуются специальные знания. Следующий 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;
В 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'];
Улучшение @ 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)
, используя ответ 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'
);
Простой запрос будет делать SHOW TABLE STATUS LIKE 'table_name'
Вы можете использовать
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
, или если вы не хотите использовать information_schema, вы можете использовать этот
SHOW TABLE STATUS LIKE 'table_name'
используйте «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 допускает только одно поле auto-increment для каждой таблицы, и оно также должно быть основным ключом, гарантирующим уникальность.
Обратите внимание, что когда вы получите следующий идентификатор вставки, он может быть недоступен, если вы используете его, поскольку имеющееся у вас значение находится только в пределах этой транзакции. Поэтому в зависимости от нагрузки на вашу базу данных это значение может быть уже использовано к моменту поступления следующего запроса.
Я бы предложил вам просмотреть ваш дизайн, чтобы убедиться, что вам не нужно знать, какой авто -increment, чтобы назначить следующий
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Хотя я сомневаюсь в его производительности, но на 100% надежнее
Решение:
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" - это название нашей базы данных
Вы можете получить следующее значение автоинкремента, выполнив:
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()
ретроспективно и, таким образом, может быть гарантирована в рамках текущего соединения. Этот ребенок перспективен и поэтому не уникален для каждого соединения и на него нельзя положиться. Только в одной базе данных подключений он будет работать, но сегодня у баз данных с одним соединением есть привычка к тому, чтобы завтра было несколько баз данных соединений.