J'utilise des fonctions d'une bibliothèque php qui utilise mysql_insert_id()
de temps en temps. Maintenant, j'ai modifié quelques fonctions qui insèrent des données dans des tables de sorte que la valeur de clé primaire est explicitement spécifiée, par exemple. J'insère une ligne avec ID = 300 suivi d'une ligne avec ID = 200 quand la table avait à l'origine 10 lignes. Je me demande si mysql_insert_id se comportera comme prévu, c'est-à-dire retournera la valeur explicitement spécifiée pour la colonne AUTO_INCREMENT PRIMARY KEY.Comportement de mysql_insert_id()
Répondre
Tableau:
CREATE TABLE `foo` (
`id` int(11) NOT NULL auto_increment,
`value` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ;
code:
print phpversion()."\n";
mysql_connect('localhost','user','pass');
mysql_select_db('database');
mysql_query('INSERT INTO `foo` (`id`,`value`) VALUES(100,"bar")');
print var_export(mysql_insert_id())."\n";
mysql_query('INSERT INTO `foo` (`value`) VALUES("zoid")');
print var_export(mysql_insert_id())."\n";
mysql_query('INSERT INTO `foo` (`id`,`value`) VALUES(99,"yargh")');
print var_export(mysql_insert_id())."\n";
$q = mysql_query('SHOW TABLE STATUS LIKE "foo"');
$status = mysql_fetch_assoc($q);
mysql_free_result($q);
print $status['Auto_increment']."\n";
mysql_query('INSERT INTO `foo` (`value`) VALUES("whatever")');
print var_export(mysql_insert_id())."\n";
Sortie:
5.2.XX-0.dotdeb.1
100
101
99
102
102
TL/version DR: elle retourne le dernier identifiant, que ce soit incrémentée automatique ou explicitement donné .
MISE À JOUR: Ajouté INSERT
avec id < 100
, comme suggéré par Mchl.
Je ne veux pas
pense il le fera. Il doit retourner 0:
L'ID généré pour une colonne AUTO_INCREMENT par la dernière requête sur le succès, 0 si la requête précédente ne génère pas une valeur AUTO_INCREMENT, ou FALSE si aucune connexion MySQL a été établie. - http://php.net/manual/en/function.mysql-insert-id.php
L'ID est pas généré devrait donc retourner 0.
Comme il a été prouvé, dans la pratique, ce n'est pas le cas.
+1 Oui, comme ci-dessus. – Mike
C'est beaucoup de spéculations. –
Non c'est faux. J'ai couru des tests. sur plusieurs serveurs. –
La réponse est oui,
il retourne les valeurs que vous avez saisies. J'ai aimé cette question, j'ai donc essayé plusieurs fois dans plusieurs serveurs ayant des configurations différentes.
il retournera la valeur que vous avez inséré,
le mysql_insert_id() retourne la valeur de la Feild auto_increment, il ne doit pas être généré automatiquement.
Aussi, il retournera 0, si vous essayez d'attribuer une valeur dupilcate à votre clé, car elle ne sera pas insérée correctement.
si vous voulez essayer ensuite utiliser la requête suivante
--edit .. avec plusieurs inserts
<?php
$link = mysql_connect('localhost', 'root', 'techping');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('test');
mysql_query("INSERT INTO test (id, name) values (100,'kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
mysql_query("INSERT INTO test (id, name) values (125,'kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
mysql_query("INSERT INTO test (id, name) values (121,'kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
mysql_query("INSERT INTO test (id, name) values ('','kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
mysql_query("INSERT INTO test (id, name) values (250,'kossu')");
printf("Last inserted record has id %d<br />", mysql_insert_id());
?>
Les résultats:
Last inserted record has id 100
Last inserted record has id 125
Last inserted record has id 121
Last inserted record has id 126
Last inserted record has id 250
Voir quand je laisse le autoincrement générer l'ID après 121, il a généré la valeur suivante (126) après le plus grand id (c'est-à-dire 125 dans ce cas), pas 122
+1 pour faire des tests avant de répondre. Le comportement très inhabituel pour le stackoverflow. –
- 1. Php: ingres équivalent de mysql_insert_id()
- 2. Utilisation de la fonction mysql_insert_id
- 3. Equivalent de mysql_insert_id() pour Postgresql?
- 4. Mysql_insert_id with Doctrine
- 5. Appel à mysql_insert_id Avertit
- 6. mysql_insert_id alternative pour postgresql
- 7. mysql_insert_id et mes malheurs?
- 8. mysql_insert_id() ne fonctionne pas
- 9. Espaces vierges dans mysql_insert_id(); retour
- 10. Aidez-moi à supprimer mysql_insert_id
- 11. Problèmes avec LAST_INSERT_ID() et mysql_insert_id()
- 12. Impossible d'obtenir mysql_insert_id() pour travailler
- 13. php mysql_insert_id(); ne fonctionne pas
- 14. Pourquoi PHP mysql_insert_id() retourne zéro?
- 15. Utiliser mysql_insert_id pour insérer beaucoup de données
- 16. Php, MySql - Connexions DB multiples et mysql_insert_id()
- 17. Problème mysql_insert_id dans l'insertion de données de concurrence
- 18. Renvoyer l'ID de la table de la table avec mysql_insert_id
- 19. Comment attacher mysql_insert_id dans un téléchargement de fichier?
- 20. Quel est l'équivalent de la fonction mysql_insert_id() dans sqlserver?
- 21. comment passer mysql_insert_id() à $ _POST ou une action de formulaire?
- 22. Comment utiliser mysql_insert_id avec une table de jonction
- 23. pourrait mysql_insert_id() obtenir une valeur de la requête
- 24. comportement de comportement étrange
- 25. Commande C#/SQLite équivalente pour la commande PHP mysql_insert_id()?
- 26. mysql_insert_id() pour voir la valeur des derniers enregistrements insérés
- 27. Peut-être que mysql_insert_id() retournera un identifiant inattendu
- 28. PHP mysql_insert_id() pour les clés primaires MySQL UUID()?
- 29. Comportement de
- 30. mysql_insert_id() a cessé de fonctionner après la mise à jour de PHP
Vous êtes n ot utiliser correctement une clé primaire auto_increment si vous insérez avec une clé spécifique. –
Ouais mais ...:) –
Dans le cas où quelqu'un se demande, j'essayais de synchroniser mes utilisateurs avec la table des utilisateurs de phpbb3 en utilisant la fonction 'user_add' (http://wiki.phpbb.com/display/DEV/Function.user_add), et en définissant explicitement une valeur pour 'user_id' a fonctionné. –