web-dev-qa-db-fra.com

SQL - Insertion d'une ligne et retour de la clé primaire

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.

21
Samuel Moriarty

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
44
Michael Fredrickson

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)
26
marc_s

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. 

5
Dagg Nabbit

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é.

4
Farhan

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).

1
Ian

Pour SQLite:

SELECT [Column_1],  [Column_2],...  [Column_n]
FROM [YourTable]
WHERE rowid = (SELECT last_insert_rowid())

tandis que

  • Column_1, Column_2, ... Column_n: sont la clé primaire de YourTable.

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: 

https://www.sqlite.org/lang_corefunc.html#last_insert_rowid

0
Esa

Pour Postgresql:

SELECT CURRVAL(pg_get_serial_sequence('schema.table','id'))

Source: https://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id

0
z-index