2009-06-17 6 views
1

J'essaie de conserver les tables de base de données pour un projet sur lequel je travaille bien et normalisé, mais j'ai rencontré un problème. J'essaie de comprendre comment je peux insérer une ligne dans une table et ensuite découvrir quelle est la valeur de la colonne auto_incremented id pour que je puisse insérer des données supplémentaires dans une autre table. Je sais qu'il existe des fonctions telles que mysql_insert_id qui "obtiennent l'ID généré à partir de l'opération INSERT précédente". Cependant, si je ne me trompe pas mysql_insert_id retourne juste l'ID de la toute dernière opération. Ainsi, si le trafic sur le site est suffisant, cela ne renverra pas nécessairement l'identifiant de la requête car une autre requête aurait pu être exécutée entre l'insertion de la ligne et la recherche de l'identifiant. Cette compréhension de mysql_insert_id est-elle correcte? Toutes les suggestions sur la façon de le faire sont grandement appréciées. Merci.Récupération de l'index d'une ligne insérée

Répondre

5

LAST_INSERT_ID() a une portée de session.

Il retournera la valeur d'identité insérée dans la session en cours. Si vous n'insérez aucune ligne entre INSERT et LAST_INSERT_ID, cela fonctionnera bien.

Notez cependant que pour de multiples insertions de valeur, il renvoie l'identité de la première ligne insérée, pas le dernier:

INSERT 
INTO mytable (identity_column) 
VALUES (NULL) 

SELECT LAST_INSERT_ID() 

-- 
1 

INSERT 
INTO mytable (identity_column) 
VALUES (NULL), (NULL) 

/* This inserts rows 2 and 3 */ 

SELECT LAST_INSERT_ID() 

-- 
2 

/* But this returns 2, not 3 */ 
0

Vous pouvez:

A. Supposons que won » t un problème et l'utilisation mysql_insert_id

ou

B. Incluez un horodatage dans la ligne et récupérez le dernier ID inséré avant de l'insérer dans une autre table.

0

La solution générale est de faire l'une des deux choses:

  1. Créer une requête de procédure qui fait l'insert et récupère ensuite le dernier identifiant Inséré (. En utilisant, par exemple LAST_INSERT_ID()) et renvoie comme sortie de la requête.

  2. Est-ce que l'insert, effectuez un autre insert où l'identifiant est quelque chose comme (sélectionnez myid de table où 'val' somecolumnval =)

2b. Ou faites le select explicite et autonome, puis faites les autres insertions en utilisant cette valeur. L'inconvénient de la première est que vous devez écrire un proc pour chacun de ces cas. L'inconvénient de la seconde est que certains moteurs de base de données n'acceptent pas cela, et cela encombre votre code, et peut être lent si vous devez faire un où sur plusieurs colonnes.

Cela suppose qu'il peut y avoir des insertions entre vos appels sur lesquels vous n'avez aucun contrôle. Si vous avez un contrôle explicite, l'une des autres solutions ci-dessus est probablement meilleure.

Questions connexes