SQL - Insertion d'une ligne et le retour de la clé primaire
J'ai un petit problème spirituel. Dites, j'ai inséré une ligne avec des données dans un tableau avec une clé primaire est présent. Comment pourrait-on ", SÉLECTIONNEZ" la clé primaire de la ligne un juste inséré?
J'aurais été plus précis et a mentionné que je suis en train de
utilisez SQLite.
- Qui RBDMS utilisez-vous?
Vous devez vous connecter pour publier un commentaire.
Pour MS SQL Server:
SCOPE_IDENTITY()
vous renvoie la dernière valeur d'identité généré à l'intérieur de votre champ d'application actuel:INT IDENTITY
(ouBIGINT IDENTITY
) - tout autre type de PK (comme un GUID ou autre chose) est pas prise en charge parSCOPE_IDENTITY()
Pour SQL Server 2005 et jusqu', et quel que soit le type de votre clé primaire est, vous pouvez toujours utiliser le
SORTIE
l'article pour renvoyer les valeurs inséré:PrimaryKey
n'est pas un mot clé (et le résultat seraInvalid column name 'PrimaryKey'.
si vous essayez de l'utiliser. Il doit être remplacé par votre nom de colonne.PrimaryKey
pour illustrer le fait que, quelle que soit la colonne est défini comme clé primaire doit être utilisé (depuis l'OP de ne pas mentionner ce que la colonne est sa clé primaire)Pour MySQL, utilisez LAST_INSERT_ID()
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
Vous devez également être en mesure de démarrer une transaction, insérer la ligne et sélectionnez la ligne en utilisant un domaine qui a une valeur unique que vous venez d'insérer, comme un timestamp ou le guid. Cela devrait fonctionner dans pratiquement n'importe quel SGBDR qui prend en charge les transactions, tant que vous avez un bon champ unique pour sélectionner la ligne avec.
SQL Server:
Vous pouvez utiliser
@@IDENTITY
. Après une instruction insert, vous pouvez exécuter:Cela vous donnera la clé primaire de l'enregistrement que vous venez d'insérer. Si vous prévoyez de l'utiliser plus tard, je propose de l'enregistrer:
Si vous utilisez ce dans une procédure stockée et souhaitez accéder dans votre application, assurez-vous d'avoir nocount off.
IDENTITY
colonne - je vous recommande d'utiliserSCOPE_IDENTITY()
plutôt que@@IDENTITY
Si vous avez besoin de récupérer le nouvel indice dans MS SQL quand il y a des déclencheurs sur la table, alors vous devez utiliser un peu de solution de contournement. Une simple SORTIE ne fonctionnera pas. Que vous avez à faire quelque chose comme ceci (en VB.NET):
Si vous l'utilisez .NET, alors la valeur de retour de cette requête peut être directement convertie en un entier (vous devez appeler le "ExecuteScalar" sur la .NET SqlCommand pour obtenir le retour).
Pour Postgresql:
Source: https://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id
RETURNING
clause deINSERT
la commande. Pour citer le doc:The optional RETURNING clause causes INSERT to compute and return value(s) based on each row actually inserted. This is primarily useful for obtaining values that were supplied by defaults, such as a serial sequence number.
Pour SQLite:
alors que:
Si vous aviez créé YourTable avec une clé primaire remplacé rowid (c'est à dire une colonne pk défini comme INTEGER PRIMARY KEY), il suffit d'utiliser:
Qui est un cas commun.
Enfin, cela ne marchera pas pour WITHOUT_ROWID tables.
Veuillez Vérifier:
https://www.sqlite.org/lang_corefunc.html#last_insert_rowid
rowid
, pas de clé primaire, comme demandé par l'OP), mais il est une réponse. Je vais voterLooks OK.
Que, en théorie, devrait vous retourner que le dernier id inséré. Si c'est un chargé de base de données avec de nombreux inserts de passe il ne peut pas obtenir celui que vous venez de fait, mais un autre.
De toute façon, une alternative à d'autres méthodes.