J'ai un petit problème d'esprit. Dites, j'ai inséré une ligne avec des données dans une table où une clé primaire est présente. Comment pourrait-on "sélectionner" la clé primaire de la ligne que l'on vient d'insérer?
J'aurais dû être plus spécifique et mentionner que je suis actuellement en utilisant SQLite.
Pour MS SQL Server:
SCOPE_IDENTITY()
vous renverra la dernière valeur d'identité générée dans votre étendue actuelle:
SELECT SCOPE_IDENTITY() AS NewID
Pour SQL Server 2005 et versions ultérieures et quel que soit le type de votre clé primaire, vous pouvez toujours utiliser la clause OUTPUT
pour renvoyer les valeurs insérées:
INSERT INTO dbo.YourTable(col1, col2, ...., colN)
OUTPUT Inserted.PrimaryKey
VALUES(val1, val2, ....., valN)
Pour MySQL, utilisez LAST_INSERT_ID ()
http://dev.mysql.com/doc/refman/5.0/fr/getting-unique-id.html
Vous devriez également pouvoir démarrer une transaction, insérer la ligne et sélectionner celle-ci à l'aide d'un champ ayant une valeur unique que vous venez d'insérer, comme un horodatage ou un guid. Cela devrait fonctionner dans pratiquement tous les SGBDR prenant en charge les transactions, à condition que vous disposiez d'un bon champ unique pour sélectionner la ligne.
MS SQL
Vous pouvez utiliser @@ IDENTITY. Après une instruction insert, vous pouvez exécuter:
select @@identity
Cela vous donnera la clé primaire de l'enregistrement que vous venez d'insérer. Si vous prévoyez l’utiliser plus tard, je vous suggère de le sauvegarder:
set @MyIdentity = @@identity
Si vous l'utilisez dans une procédure stockée et souhaitez y revenir dans votre application, assurez-vous que nocount est désactivé.
Si vous devez extraire le nouvel index dans MS SQL lorsque la table contient des déclencheurs, vous devez utiliser une solution de contournement. Une simple sortie ne fonctionnera pas. Vous devez faire quelque chose comme ça (dans VB.NET):
DECLARE @newKeyTbl TABLE (newKey INT);
INSERT INTO myDbName(myFieldName) OUTPUT INSERTED.myKeyName INTO @newKeyTbl VALUES('myValue'); " & _
SELECT newKey FROM @newKeyTbl;"
Si vous utilisez .NET, la valeur de retour de cette requête peut être directement convertie en un entier (vous devez appeler "ExecuteScalar" sur la commande .NET SqlCommand pour obtenir le retour).
Pour SQLite:
SELECT [Column_1], [Column_2],... [Column_n]
FROM [YourTable]
WHERE rowid = (SELECT last_insert_rowid())
tandis que:
Si vous avez créé YourTable avec la clé primaire remplacée rowid (c'est-à-dire une colonne pk définie comme INTEGER PRIMARY KEY), il vous suffit d'utiliser:
SELECT last_insert_rowid()
Ce qui est un cas fréquent.
Enfin, cela ne fonctionnera pas pour les tables WITHOUT_ROWID.
Vérifiez s'il vous plaît:
Pour Postgresql:
SELECT CURRVAL(pg_get_serial_sequence('schema.table','id'))
Source: https://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id