2010-10-03 11 views
0

Je souhaite ajouter une ligne à l'aide de l'instruction SQL INSERT. Est-il possible que dans le cadre de cette déclaration, je peux en quelque sorte obtenir la valeur de la colonne userId que je ne mets pas à jour mais est la clé primaire AUTO_INCREMENT. J'ai besoin de cette valeur pour mettre à jour une autre table, mais je ne peux pas suivre immédiatement l'instruction Insert avec une instruction SELECT car il n'y a aucun autre identificateur unique dans la table sur laquelle sélectionner. Est-il possible d'obtenir le numéro de ligne (nom de la colonne userId) et si oui, comment le faites-vous?SQL: est-il possible de combiner une instruction INSERT et SELECT en une instruction

+2

Quel RDBMS utilisez-vous? Je devine [peut-être mysql] (http://stackoverflow.com/questions/3558585/how-to-check-for-null-value-for-a-double-which-is-taken-from-a-database)? Veuillez marquer vos questions sql avec cette information. –

+0

@Martin Smith: MySQL – Ankur

Répondre

3

Dans MySQL, il est appelé LAST_INSERT_ID(). Je crois être techniquement correct, les deux déclarations devraient être enveloppées dans une transaction afin que d'autres INSERT ne gâchent pas quelle ID vous obtenez.

Dans SQL Sever, vous avez IDENT_CURRENT ('nom_table') qui ne l'attrape que dans cette table (il faut toujours qu'une transaction soit sûre). Vous pouvez également utiliser SCOPE_IDENTITY() qui théoriquement retournera toujours celui que vous attendez tant que vous ne faites pas quelque chose de bizarre avec votre connexion.

+0

Qu'est-ce qui pourrait être «bizarre» à propos d'une connexion pour empêcher le retour de SCOPE_IDENTITY comme prévu? Pour les environnements multi-utilisateurs, éloignez-vous de 'IDENT_CURRENT', sauf si vous voulez l'identité de l'autre type (' IDENT_CURRENT' renvoie le dernier ID inséré ** d'une table depuis n'importe quelle session et n'importe quelle portée **). 'SCOPE_IDENTITY()' fonctionnera. –

+0

'SCOPE_IDENTITY()' devrait fonctionner * le plus * du temps - il y a apparemment un bug impliquant le parallélisme dans SQL Server 2005/2008: http://blog.sqlauthority.com/2009/03/24/sql-server- 2008-scope_identity-bug-avec-multi-processeur-parallèle-plan-et-solution/ – LittleBobbyTables

+0

@ p.campbell, Si Microsoft entièrement mis en œuvre l'esprit d'ACID, envelopper une transaction autour de l'insert et sélectionnez avec IDENT_CURRENT devrait fonctionner très bien. Je n'ai aucune idée s'ils * ont * fait * ou non. Mais ça * devrait * fonctionner =) – colithium