web-dev-qa-db-fra.com

Comment obtenir le prochain identifiant auto-incrémenté dans mysql

Comment obtenir le prochain identifiant dans mysql pour l'insérer dans la table

INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'Paypal', CONCAT("sahf4d2fdd45", id))
94
faressoft

Utilisez LAST_INSERT_ID() à partir de votre requête SQL.

Ou

Vous pouvez également utiliser mysql_insert_id() pour l'obtenir en utilisant PHP.

12
Sarfraz

Vous pouvez utiliser 

SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;

ou si vous ne souhaitez pas utiliser information_schema, vous pouvez utiliser ceci

SHOW TABLE STATUS LIKE 'table_name'
232
ravi404

Vous pouvez obtenir la valeur next auto-incrémentée en faisant:

SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'

Notez que vous devriez utiliser not pour modifier la table, utilisez une colonne auto_increment pour le faire automatiquement.
Le problème est que last_insert_id() est rétrospectif et peut donc être garanti dans la connexion actuelle.
Ce bébé est prospectif et n’est donc pas unique par connexion et ne peut être invoqué.
Cela ne fonctionnerait que dans une base de données à connexion unique, mais les bases de données à connexion unique ont aujourd'hui l'habitude de devenir plusieurs bases de données de connexion demain.

Voir: SHOW TABLE STATUS

40
Johan

La réponse principale utilise PHP MySQL_ pour une solution, en pensant que je partagerais une mise à jour PHP MySQLi_ pour y parvenir. Il n'y a pas d'erreur dans cet exemple!

$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'];

Lance le prochain incrément automatique à venir dans une table.

10
Hexchaimen

Dans PHP, vous pouvez essayer ceci:

$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;

OR

$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
9
Naresh Jain

Cela renverra une valeur d'incrémentation automatique pour la base de données MySQL et je n'ai pas vérifié avec d'autres bases de données. Veuillez noter que si vous utilisez une autre base de données, la syntaxe de la requête peut varier.

SELECT AUTO_INCREMENT 
FROM information_schema.tables
WHERE table_name = 'your_table_name'
     and table_schema = database();
8
Chaminda Bandara

Solution:

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" est le nom de notre base de données

6
Angel

Requête simple ferait SHOW TABLE STATUS LIKE 'table_name'

4
Raa

Vous pouvez utiliser mysql trigger

4
Nick Pavluk

Vous ne pouvez pas utiliser l'identifiant lors de l'insertion, vous n'en avez pas besoin non plus. MySQL ne connaît même pas l'ID lorsque vous insérez cet enregistrement. Vous pouvez simplement enregistrer "sahf4d2fdd45" dans la table payment_code et utiliser id et payment_code ultérieurement.

Si vous avez vraiment besoin de votre code paiement_code pour qu'il contienne l'ID, mettez à jour la ligne après l'insertion pour ajouter l'ID.

3
Jacob

Je suggère de repenser ce que vous faites. Je n'ai jamais connu un cas d'utilisation unique où cette connaissance particulière est requise. Le prochain identifiant est un détail d'implémentation très spécial et je ne compterais pas pour l'obtenir sans danger pour ACID.

Effectuez une transaction simple qui met à jour votre ligne insérée avec le dernier identifiant:

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;
3
Markus Malkusch

De quoi avez-vous besoin du prochain identifiant incrémentiel? 

MySQL n'autorise qu'un seul champ à incrémentation automatique par table et doit également être la clé primaire pour garantir l'unicité. 

Notez que lorsque vous obtenez le prochain ID d'insertion, il peut ne pas être disponible lorsque vous l'utilisez car la valeur que vous avez est uniquement dans la portée de cette transaction. Par conséquent, en fonction de la charge de votre base de données, cette valeur peut déjà être utilisée au moment de la prochaine requête.

Je vous suggérerais de revoir votre conception pour vous assurer que vous n'avez pas besoin de savoir quelle valeur d'auto-incrémentation attribuer 

utilisez "mysql_insert_id ()". mysql_insert_id () agit sur la dernière requête effectuée, assurez-vous d'appeler mysql_insert_id () immédiatement après la requête qui génère la valeur.

Ci-dessous, l'exemple d'utilisation:

<?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());
    ?>

J'espère que l'exemple ci-dessus est utile.

2
sagarchavda

Vous devez vous connecter à MySQL et sélectionner une base de données avant de pouvoir le faire. 

$table_name = "myTable"; 
$query = mysql_query("SHOW TABLE STATUS WHERE name='$table_name'"); 
$row = mysql_fetch_array($query); 
$next_inc_value = $row["AUTO_INCREMENT"];  
2
jondinham

en utilisant la réponse 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

en utilisant dans votre requête d'insertion, pour créer un hachage SHA1. ex.:

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( getAutoincrementalNextval ('document') ),
    'Title',
    'Body'
);
1
Paulo A. Costa
mysql_insert_id();

C'est tout :)

1
user3814281
SELECT id FROM `table` ORDER BY id DESC LIMIT 1

Bien que je doute de sa productivité mais de sa fiabilité à 100%

1
Tebe

Pour moi ça marche et ça a l'air simple:

 $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
0
Toncsiking

Amélioration de @ ravi404, au cas où votre auto-incrémentation compenserait IS, PAS 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): le moteur de base de données semble toujours considérer un décalage de 1. Vous devez donc abandonner cette hypothèse, puis ajouter la valeur facultative de @@ auto_increment_offset ou la valeur par défaut à 1: IFNULL (@@ auto_increment_offset, 1) 

0
Olivier