2011-01-19 6 views
3

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

+2

Vous êtes n ot utiliser correctement une clé primaire auto_increment si vous insérez avec une clé spécifique. –

+0

Ouais mais ...:) –

+0

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é. –

Répondre

4

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.

+1

Ce qui manque à votre test, c'est un autre insert avec un id <100, puis un autre insert sans ID. (ID automatique sera 102) – Mchl

+1

@Mchl Pourquoi? Pour prouver, il n'y a pas de * auto_decrement *? –

+0

Afin de démontrer pleinement le comportement auto_increment. – Mchl

0

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.

+0

+1 Oui, comme ci-dessus. – Mike

+0

C'est beaucoup de spéculations. –

+0

Non c'est faux. J'ai couru des tests. sur plusieurs serveurs. –

4

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

+0

+1 pour faire des tests avant de répondre. Le comportement très inhabituel pour le stackoverflow. –

Questions connexes