Récupérer le dernier id inséré pour plusieurs lignes
Lors de l'insertion de données dans une table qui a une auto-incrémenté PK, j'ai besoin d'obtenir cette clé pour l'utiliser dans une autre déclaration. Autant de questions sur SI cela peut être fait en PHP à l'aide de mysql_insert_id()
.
Cependant, j'ai été regroupement mon insère ensemble, j'ai donc insérer plus d'une ligne à la fois. J'ai fait ce que j'ai deviné, il y aurait probablement des problème de performance, veuillez indiquer si je me trompe. De toute façon, autant que j'en suis conscient, cependant, mysql_insert_id()
seulement retourne le dernier identifiant, quand j'ai besoin de l'id de toutes les lignes insérées.
Je suppose que dans ce cas je le pouvais:
-
Faire quelques opérations mathématiques simples pour calculer tous les id à l'aide de
mysql_insert_id()
et le nombre de lignes que j'ai entré. Mais est-ce garanti être toujours correct? -
Utiliser plusieurs instructions insert, une pour chaque ligne
-
Générer mon Id avant et utiliser l'auto-incrémentation.
Je suis sûr que ce doit être un problème classique, donc, je me demande sur quel est le plus commun et conseillé approches.
Vous devez vous connecter pour publier un commentaire.
Appel last_insert_id() vous donne l'id de la PREMIÈRE ligne insérée dans le dernier lot. Tous les autres inséré, sont garantis à séquentielle.
Sauf si vous êtes en train de faire quelque chose de très étrange, cela vous permet de vous calculez l'ID de chaque ligne assez facilement.
En fait le comportement varie en 5.1 selon le réglage de la innodb incrément automatique paramètre de mode; ce qui ne devrait pas d'importance. Tant que vous ne modifiez pas le nom par défaut, vous verrez le comportement attendu.
Il y a parfois des cas où ce n'est pas faire ce que vous attendez et n'est pas utile - par exemple si vous faites un DOUBLE de la CLÉ de mise à JOUR ou INSÉRER IGNORER. Dans ces cas, vous aurez besoin de faire quelque chose d'autre pour travailler les Id de chaque ligne.
Mais pour une plaine de vanille INSÉRER lot, avec des valeurs non spécifiées pour l'auto-inc colonne, c'est facile.
Une description complète de la façon dont auto-incrémente sont traitées en innodb est ici
Il ya un couple d'approches que j'utilise, si je m':
Tout d'abord, il y a le
CreateDate
champ avec une valeur par défaut deCURRENT_TIMESTAMP
méthode. Vous l'essentiel de sélectionnerCURRENT_TIMESTAMP
pour obtenir la date, exécutez l'insertion, puisselect id from table where CreateDate > $mytimestamp
.Deuxièmement, vous pouvez créer un trigger sur la table pour se connecter
after insert
et mettre le nouveau Id dans un peu d'audit tableau. Tronquer la table avant de vérifier les codes, si. Je voudrais utiliser cette méthode si votre table est des millions et des millions de lignes.CURRENT_TIMESTAMP
approche semble un peu dangereux pour moi. Que faire si vous et quelqu'un d'autre à écrire à la même table en même temps (même date)?