Как получить следующий идентификатор в mysql, чтобы вставить его в таблицу
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Как получить следующий идентификатор в mysql, чтобы вставить его в таблицу
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Ответы:
Используйте LAST_INSERT_ID()
из вашего SQL-запроса.
Или
Вы также можете использовать его mysql_insert_id()
для получения с помощью PHP.
LAST_INSERT_ID()
.
mysqli_insert_id
Ты можешь использовать
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
или если вы не хотите использовать information_schema, вы можете использовать это
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
находится в кеше dev.mysql.com/doc/refman/8.0/en/… . В блоге Mysql также есть несколько сообщений об этом, но система, которую они упоминают, кажется устаревшей: mysqlserverteam.com/… mysqlserverteam.com/…
Вы можете получить следующее значение автоинкремента, выполнив:
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
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
? Я бы использовал обновление в after insert
триггере и last_insert_id()
, хотя ...
UPDATE
если бы тоже. Но я бы предпочел просто объединить их во время отображения и избавить от лишних хлопот.
SHOW TABLE STATUS
ожидает увидеть database name
после FROM
и 'table name pattern'
после LIKE
.
Это вернет значение автоматического увеличения для базы данных MySQL, и я не проверял с другими базами данных. Обратите внимание, что если вы используете любую другую базу данных, синтаксис запроса может быть другим.
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = 'your_database_name';
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'];
Выбрасывает следующее автоматическое приращение, появляющееся в таблице.
В 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'];
Решение:
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
payment_code
в after insert
триггере кажется лучшим вариантом.
Вы не можете использовать идентификатор при вставке, он вам и не нужен. MySQL даже не знает ID, когда вы вставляете эту запись. Вы можете просто сохранить "sahf4d2fdd45"
в payment_code
таблице и использовать id
иpayment_code
дальнейшем.
Если вам действительно нужен ваш payment_code, чтобы в нем был идентификатор, ОБНОВИТЕ строку после вставки, чтобы добавить идентификатор.
information_schema.tables
таблице.
SELECT ... CONCAT(payment_code, id)
, либо в коде вашего приложения. Вы даже можете заключить SELECT
в a VIEW
, чтобы всегда возвращать правильное значение, не беспокоясь о CONCAT в каждом SELECT из вашего приложения.
Для чего вам нужен следующий инкрементный идентификатор?
MySQL допускает только одно поле с автоинкрементом для каждой таблицы, и оно также должно быть первичным ключом, чтобы гарантировать уникальность.
Обратите внимание, что когда вы получаете следующий идентификатор вставки, он может быть недоступен при его использовании, поскольку имеющееся у вас значение находится только в рамках этой транзакции. Следовательно, в зависимости от нагрузки на вашу базу данных, это значение может уже использоваться к моменту поступления следующего запроса.
Я бы посоветовал вам пересмотреть свой дизайн, чтобы убедиться, что вам не нужно знать, какое значение автоинкремента назначить следующим
Предлагаю переосмыслить то, что вы делаете. Я никогда не встречал ни одного случая, когда требовались бы эти специальные знания. Следующий идентификатор - это особая деталь реализации, и я бы не стал рассчитывать на то, что он безопасен для 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;
используйте 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%
используя ответ 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. напр .:
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, кажется, всегда учитывает смещение 1. Поэтому вам нужно отказаться от этого предположения, а затем добавить необязательное значение @@ auto_increment_offset или значение по умолчанию 1: IFNULL (@@ auto_increment_offset, 1)
Для меня это работает и выглядит просто:
$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
$last_id
повторно, когда можно просто DESC
. Ваш while
блок проделал кучу бесполезной работы.
auto_increment
столбик