Como obter o próximo id no mysql para inseri-lo na tabela
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Como obter o próximo id no mysql para inseri-lo na tabela
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Respostas:
Use LAST_INSERT_ID()da sua consulta SQL.
Ou
Você também pode usar mysql_insert_id()para obtê-lo usando PHP.
LAST_INSERT_ID().
mysqli_insert_id
Você pode usar
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
ou se você não deseja usar information_schema você pode usar este
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENTestá armazenado em dev.mysql.com/doc/refman/8.0/en/… . O blog do Mysql também tem várias postagens sobre isso, mas o sistema variável que eles mencionam parece desatualizado: mysqlserverteam.com/… mysqlserverteam.com/…
Você pode obter o próximo valor de incremento automático fazendo:
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
Observe que você não deve usar isso para alterar a tabela, use uma coluna auto_increment para fazer isso automaticamente.
O problema é que last_insert_id()é retrospectivo e, portanto, pode ser garantido dentro da conexão atual.
Este bebê é prospectivo e, portanto, não é o único por conexão e não é confiável.
Isso funcionaria apenas em um único banco de dados de conexão, mas os bancos de dados de conexão única hoje têm o hábito de se tornarem bancos de dados de várias conexões amanhã.
Vejo: SHOW TABLE STATUS
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'? Eu usaria a atualização no after insertgatilho e last_insert_id(), embora ...
UPDATEse eu também tivesse. Mas prefiro apenas concatenar os dois no momento da exibição e evitar todo o trabalho.
SHOW TABLE STATUSespera ver database namedepois FROMe 'table name pattern'depois LIKE.
Isso retornará o valor de incremento automático para o banco de dados MySQL e não verifiquei com outros bancos de dados. Observe que se você estiver usando qualquer outro banco de dados, a sintaxe da consulta pode ser diferente.
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();
A resposta principal usa PHP MySQL_ para uma solução, pensei em compartilhar uma solução PHP MySQLi_ atualizada para conseguir isso. Não há saída de erro neste exemplo!
$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'];
Expulsa o próximo incremento automático que surge em uma tabela.
Em PHP, você pode tentar isso:
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
OU
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
Solução:
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" é o nome da nossa base de dados
Você pode usar o gatilho mysql
payment_codeno after insertgatilho parece ser a melhor opção.
Você não pode usar o ID durante a inserção, nem precisa dele. O MySQL nem sabe o ID quando você está inserindo esse registro. Você poderia apenas salvar "sahf4d2fdd45"na payment_codetabela e usar ide payment_codedepois.
Se você realmente precisa que seu código_de_pagamento tenha o ID nele, ATUALIZE a linha após a inserção para adicionar o ID.
information_schema.tablestabela.
SELECT ... CONCAT(payment_code, id)ou no código do seu aplicativo. Você pode até envolver o SELECTem a VIEW, de forma que sempre retorne o valor correto, sem se preocupar com o CONCAT em cada SELECT do seu aplicativo.
Para que você precisa do próximo ID incremental?
O MySQL permite apenas um campo de incremento automático por tabela e também deve ser a chave primária para garantir a exclusividade.
Observe que quando você obtém o próximo ID de inserção, ele pode não estar disponível ao usá-lo, pois o valor que você possui está apenas no escopo dessa transação. Portanto, dependendo da carga em seu banco de dados, esse valor já pode ser usado no momento em que a próxima solicitação chegar.
Eu sugeriria que você revise seu projeto para garantir que não precise saber qual valor de incremento automático atribuir a seguir
Sugiro repensar o que você está fazendo. Nunca experimentei um único caso de uso em que esse conhecimento especial seja necessário. O próximo id é um detalhe de implementação muito especial e eu não contaria que ele fosse seguro para ACID.
Faça uma transação simples que atualize sua linha inserida com o último 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;
use "mysql_insert_id ()". mysql_insert_id () atua na última consulta realizada, certifique-se de chamar mysql_insert_id () imediatamente após a consulta que gera o valor.
Abaixo estão os exemplos de uso:
<?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());
?>
Espero que o exemplo acima seja útil.
mysql_insert_id();
É isso aí :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Embora eu duvide de sua produtividade, mas é 100% confiável
usando a resposta de 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
usando em sua consulta de inserção, para criar um Hash SHA1. ex.:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
Melhoria de @ ravi404, no caso de seu deslocamento de incremento automático NÃO SER 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): o motor db parece sempre considerar um deslocamento de 1. Portanto, você precisa descartar essa suposição e, em seguida, adicionar o valor opcional de @@ auto_increment_offset, ou padrão para 1: IFNULL (@@ auto_increment_offset, 1)
Para mim funciona e parece simples:
$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_idrepetidamente quando você pode apenas DESC. Seu whilebloco fez um monte de trabalho inútil.
auto_incrementcoluna