138 votes

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

Comment obtenir l'identifiant suivant 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))

1 votes

Utiliser un auto_increment colonne

0 votes

Voulez-vous que le suivant id, ou l'id de la ligne que vous êtes en train d'insérer ? Autrement dit, l'identifiant à la fin du code de paiement doit-il être l'identifiant de la ligne dans laquelle le code de paiement est stocké ?

0 votes

Id de la ligne que je suis en train d'insérer

277voto

ravz Points 2023

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'

0 votes

Merci pour les deux premières options.. Mais la troisième est juste le numéro deux appelé par PHP... Je ne suis pas sûr de ce qui rend cette méthode plus rapide sur les grandes bases de données...

1 votes

@GerardONeill l'a supprimé

0 votes

@JohnIsaiahCarmona il y a une grande liste de fonctions que vous pourriez aussi avoir besoin de regarder. Référence de la fonction Mysql

55voto

Johan Points 34755

Vous pouvez obtenir le suivant auto-incrémenter la valeur 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 devez no utilisez ceci pour modifier la table, utilisez une colonne auto_increment pour le faire automatiquement à la place.
Le problème est que last_insert_id() est rétrospective et peut donc être garantie dans le cadre de la connexion actuelle.
Ce bébé est prospectif et n'est donc pas unique par connexion et ne peut être fiable.
Cela ne fonctionnerait que dans une base de données à connexion unique, mais les bases de données à connexion unique d'aujourd'hui ont l'habitude de devenir des bases de données à connexion multiple demain.

Voir : SHOW TABLE STATUS

8 votes

Je ne l'ai pas déclassé, mais le problème lorsque l'on tente d'utiliser la dernière valeur auto-incrémentée est qu'il se peut qu'elle ne soit plus la dernière au moment où l'on veut l'utiliser, quelle que soit la rapidité avec laquelle le SELECT et l'INSERT suivant sont effectués.

0 votes

@Mike, que se passe-t-il si cela est fait en une seule requête ? Quelque chose comme insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name' ? J'utiliserais la mise à jour dans after insert déclencher et last_insert_id() mais...

1 votes

@binaryLV : Plus l'écart entre le SELECT et l'INSERT est faible, plus la probabilité que la valeur ait changé est faible, mais cela ne l'exclut pas complètement. Imaginez un système avec des milliers de requêtes par minute sur la base de données - les chances que la valeur ait changé augmentent considérablement. Le verrouillage des tables ou des lignes peut empêcher cela si la requête est effectuée en une seule fois, mais cela dépend d'un comportement particulier du moteur de la base de données, qui n'est peut-être pas bien documenté. J'opterais pour un UPDATE si je devais le faire. Mais je préfère simplement concaténer les deux au moment de l'affichage, et m'épargner tous ces tracas.

10voto

Naresh Jain Points 66

En 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;

OU

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

5 votes

Gardez à l'esprit qu'avec la première méthode, si l'enregistrement ayant l'identifiant le plus élevé est abandonné, vous créerez alors un nouvel enregistrement avec l'identifiant de l'enregistrement abandonné.

0 votes

Et si la clé précédente a été utilisée dans d'autres tables et qu'elle y est toujours conservée, on peut se retrouver avec une magie très étrange

0 votes

Le premier renvoie un identifiant erroné si vous laissez tomber le dernier enregistrement inséré,

8voto

Sarfraz Points 168484

Utilisez LAST_INSERT_ID() de votre requête SQL.

Ou

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

30 votes

@Sarfraz : La question portait sur le SUIVANT id pas le DERNIER comme vous l'avez dit en mentionnant LAST_INSERT_ID() .

4 votes

Si des lignes sont supprimées dans la table, le maximum sera erroné.

1 votes

Juste une note de '17 - les fonctions mysql* sont dépréciées - ce qui précède peut être fait avec mysqli_insert_id

7voto

Angel Points 51

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X