Как получить следующий id в mysql, чтобы вставить его в таблицу
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Как получить следующий 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.
Вы можете использовать
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()
является ретроспективным и, таким образом, может быть гарантировано в текущем соединении.
Этот ребенок перспективен и, следовательно, не уникален для каждой связи, и на него нельзя положиться.
Это будет работать только в одной базе данных соединений, но сегодня у отдельных баз данных соединений есть привычка превращаться в несколько баз данных соединений завтра.
Смотрите: SHOW TABLE STATUS
Верхний ответ использует 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'];
Это вернет значение автоинкремента для базы данных 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
Простой запрос
SHOW TABLE STATUS LIKE 'table_name'
Вы не можете использовать идентификатор во время вставки, и он вам не нужен. MySQL даже не знает идентификатор, когда вы вставляете эту запись. Вы можете просто сохранить "sahf4d2fdd45"
в таблице payment_code
и позже использовать id
и payment_code
.
Если вам действительно нужен ваш платежный_код, чтобы иметь идентификатор в нем, затем ОБНОВЛЯЙТЕ строку после вставки, чтобы добавить идентификатор.
Для чего нужен следующий инкрементный идентификатор?
MySQL допускает только одно поле auto-increment для таблицы, и оно также должно быть основным ключом, гарантирующим уникальность.
Обратите внимание, что когда вы получите следующий идентификатор вставки, он может быть недоступен, когда вы используете его, поскольку имеющееся у вас значение находится только в пределах этой транзакции. Поэтому в зависимости от нагрузки на вашу базу данных это значение может быть использовано к моменту поступления следующего запроса.
Я бы посоветовал вам просмотреть ваш дизайн, чтобы убедиться, что вам не нужно знать, какое значение автоинкремента присваивает следующий
Я предлагаю переосмыслить то, что вы делаете. Я никогда не испытывал один случай использования, когда требуются специальные знания. Следующий идентификатор - это очень специфическая деталь реализации, и я не буду рассчитывать на то, что она безопасна для ACID.
Сделайте одну простую транзакцию, которая обновляет вашу вставленную строку с последним 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;
Вам нужно подключиться к 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_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): кажется, что механизм БД всегда учитывает смещение 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