2010-06-28 9 views
6

J'essaie de récupérer l'identifiant d'une table A à insérer dans une autre table B. Je ne peux pas utiliser last_insert_id() car je n'ai rien inséré dans A. Toutes les idées sur la façon de le faire bien?SELECT dernier ID, sans INSERT

$n = mysql_query("SELECT max(id) FROM tablename"); ne semble pas fonctionner, ni ne

$n = mysql_query("SELECT max(id) FROM tablename GROUP BY id"); 
+0

Quel moteur? mysql, mssql? accès? – masfenix

+0

Que voulez-vous dire par "ne semble pas fonctionner"? –

+0

Définir "ne semble pas fonctionner". Qu'est-ce qui ne fonctionne pas? Que retourne-t-il? Que devrait-il? – CaffGeek

Répondre

15

Dans MySQL, cela ne retourner la valeur la plus élevée de la colonne id:

SELECT MAX(id) FROM tablename; 

Cependant, cela ne met pas id en $n:

$n = mysql_query("SELECT max(id) FROM tablename"); 

Pour obtenir la valeur, vous devez faire ceci:

$result = mysql_query("SELECT max(id) FROM tablename"); 

if (!$result) { 
    die('Could not query:' . mysql_error()); 
} 

$id = mysql_result($result, 0, 'id'); 

Si vous voulez obtenir le dernier insert ID de A, et l'insérer dans B, vous pouvez le faire avec une seule commande:

INSERT INTO B (col) SELECT MAX(id) FROM A; 
0

Je pense à ajouter horodatage à chaque enregistrement et obtenir la dernière. Dans cette situation, vous pouvez obtenir des ID, des rangées et d'autres opérations.

0

Vous pouvez get maximum column value and increment it:

InnoDB utilise l'algorithme suivant pour initialiser le compteur auto-incrément pour une table T qui contient une colonne AUTO_INCREMENT nommé ai_col: Après un démarrage du serveur, pour la première insérer dans une table t, InnoDB exécute l'équivalent de cette déclaration:

SELECT MAX(ai_col) FROM t FOR UPDATE; 

InnoDB incrémente de un la valeur récupérée par l'instruction et lui affecte à la colonne et au compteur d'incrémentation automatique pour la table. Si la table est vide, InnoDB utilise la valeur 1.

vous pouvez également utiliser SHOW TABLE STATUS et sa valeur "auto_increment".

+0

Comment le thread est-il sécurisé? –

+0

"pour la mise à jour" signifie que la table est verrouillée pour l'écriture jusqu'à la fin de la sélection. Bien sûr, il vaudra mieux choisir la valeur max et l'insérer dans une transaction qui verrouille ces deux tables. – silent

+1

Verrouillage pour les écritures ?! Aie. –

0

Vous pouvez commander l'Tabele descendant par id et de limiter le nombre de résultats à un:

SELECT id FROM tablename ORDER BY id DESC LIMIT 1 

MAIS:ORDER BY réarrange la table entière pour cette demande. Donc, si vous avez beaucoup de données et que vous devez répéter cette opération plusieurs fois, je ne recommanderais pas cette solution.