Come ottenere il prossimo id in mysql per inserirlo nella tabella
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Come ottenere il prossimo id in mysql per inserirlo nella tabella
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Risposte:
Usa LAST_INSERT_ID()
dalla tua query SQL.
O
Puoi anche usarlo mysql_insert_id()
per ottenerlo usando PHP.
LAST_INSERT_ID()
.
mysqli_insert_id
Puoi usare
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
o se non desideri utilizzare information_schema puoi usarlo
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
è memorizzato nella cache dev.mysql.com/doc/refman/8.0/en/… . Il blog Mysql ha anche diversi post a riguardo, ma il sistema che menzionano sembra obsoleto: mysqlserverteam.com/… mysqlserverteam.com/…
Puoi ottenere il valore di incremento automatico successivo facendo:
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
Si noti che è necessario non usare questo per modificare la tabella, utilizzare una colonna AUTO_INCREMENT per farlo automaticamente, invece.
Il problema è che last_insert_id()
è retroattivo e può quindi essere garantito nell'ambito dell'attuale connessione.
Questo bambino è potenziale e quindi non è unico per connessione e non può essere invocato.
Funzionerebbe solo in un singolo database di connessione, ma i database di connessione singola oggi hanno l'abitudine di diventare domani più database di connessione.
Vedere: 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
se lo avessi fatto anch'io. Ma preferisco solo concatenare i due al momento della visualizzazione e risparmiare tutta la seccatura.
SHOW TABLE STATUS
si aspetta di vedere database name
dopo FROM
e 'table name pattern'
dopo LIKE
.
Questo restituirà il valore di incremento automatico per il database MySQL e non ho controllato con altri database. Si noti che se si utilizza qualsiasi altro database, la sintassi della query potrebbe essere diversa.
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();
La risposta principale utilizza PHP MySQL_ per una soluzione, ho pensato di condividere una soluzione PHP MySQLi_ aggiornata per raggiungere questo obiettivo. Non vi è alcun output di errore in questo esempio!
$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'];
Esegue il successivo incremento automatico in arrivo in una tabella.
In PHP puoi provare questo:
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
O
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
Soluzione:
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" è il nome del nostro Data Base
Puoi usare il trigger mysql
payment_code
in after insert
trigger sembra essere l'opzione migliore.
Non puoi utilizzare l'ID durante l'inserimento, né ne hai bisogno. MySQL non conosce nemmeno l'ID quando inserisci quel record. Potresti semplicemente salvare "sahf4d2fdd45"
nella payment_code
tabella e utilizzare id
e in payment_code
seguito.
Se hai davvero bisogno che il tuo payment_code contenga l'ID, AGGIORNA la riga dopo l'inserimento per aggiungere l'ID.
information_schema.tables
tabella.
SELECT ... CONCAT(payment_code, id)
o nel codice dell'applicazione. Puoi anche racchiudere il SELECT
in un VIEW
, in modo da restituire sempre il valore corretto, senza preoccuparti del CONCAT in ogni SELECT dalla tua app.
A cosa serve il prossimo ID incrementale?
MySQL consente solo un campo di incremento automatico per tabella e deve anche essere la chiave primaria per garantire l'unicità.
Tieni presente che quando ottieni l'ID di inserimento successivo, potrebbe non essere disponibile quando lo utilizzi poiché il valore che hai è solo nell'ambito di quella transazione. Pertanto, a seconda del carico sul database, tale valore potrebbe essere già utilizzato al momento dell'arrivo della richiesta successiva.
Ti suggerisco di rivedere il tuo progetto per assicurarti di non aver bisogno di sapere quale valore di incremento automatico assegnare successivamente
Suggerisco di ripensare a quello che stai facendo. Non ho mai sperimentato un singolo caso d'uso in cui è richiesta quella conoscenza speciale. Il prossimo ID è un dettaglio di implementazione molto speciale e non conterei sul fatto che sia ACID sicuro.
Effettua una semplice transazione che aggiorna la riga inserita con l'ultimo 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;
usa "mysql_insert_id ()". mysql_insert_id () agisce sull'ultima query eseguita, assicurati di chiamare mysql_insert_id () immediatamente dopo la query che genera il valore.
Di seguito gli esempi di utilizzo:
<?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());
?>
Spero che l'esempio sopra sia utile.
mysql_insert_id();
Questo è tutto :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Anche se dubito della sua produttività, ma è affidabile al 100%
usando la risposta di 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
utilizzando nella tua query di inserimento, per creare un hash SHA1. ex.:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
Miglioramento di @ ravi404, nel caso in cui l'offset dell'incremento automatico NON È 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): il motore db sembra considerare sempre un offset di 1. Quindi è necessario abbandonare questo presupposto, quindi aggiungere il valore opzionale di @@ auto_increment_offset o il valore predefinito a 1: IFNULL (@@ auto_increment_offset, 1)
Per me funziona e sembra semplice:
$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
ripetutamente quando puoi semplicemente DESC
. Il tuo while
blocco ha fatto un sacco di lavoro inutile.
auto_increment
colonna