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))
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))
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...
@JohnIsaiahCarmona il y a une grande liste de fonctions que vous pourriez aussi avoir besoin de regarder. Référence de la fonction Mysql
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
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.
@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...
@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.
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'];
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é.
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
Utilisez LAST_INSERT_ID()
de votre requête SQL.
Ou
Vous pouvez également utiliser mysql_insert_id()
pour l'obtenir en utilisant PHP.
@Sarfraz : La question portait sur le SUIVANT id pas le DERNIER comme vous l'avez dit en mentionnant LAST_INSERT_ID()
.
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
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 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.
1 votes
Utiliser un
auto_increment
colonne0 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
7 votes
Dans ce cas, concaténer les valeurs lorsque vous les récupérez, et non lorsque vous les insérez. C'est beaucoup plus facile de cette façon, et vous évitez d'obtenir le mauvais identifiant, ou de devoir exécuter une mise à jour - pensez à ce qui se passerait si la ligne que vous venez d'insérer était demandée par un autre client, avant que la mise à jour n'ait eu le temps d'être exécutée : le client se retrouverait avec un code de paiement invalide. Sur un système à faible trafic, cela peut ne pas se produire, mais je ne vois pas l'intérêt de prendre ce risque.
0 votes
...ou, comme le souligne @binaryLV, le verrouillage des ressources pourrait également résoudre le problème. Voir : dev.mysql.com/doc/refman/5.5/fr/lock-tables.html
0 votes
Toutes les autres réponses qui utilisent
MAX
échouera si l'enregistrement le plus récent est supprimé de la table. D'autre part, la plupart des bases de données configurées verrouillentinformation_schema
et pour cette raison, la réponse de @ravi404 peut échouer mais en termes de robustesse, c'est la meilleure réponse jusqu'à présent.0 votes
bram.us/2008/07/30/