2010-12-15 114 views
2

Je suis en train de réfléchir comment je peux ajouter 2 lignes, dont 1 dépend de l'autre, en 1 transaction.Ajouter deux lignes avec une clé étrangère - SQL

INSERT INTO users (username) VALUES ('malcom.reynolds') 

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', <<Malcom Reynold's row ID>>) 

Raison pour laquelle je fais, c'est un que la bibliothèque que je utilise ne retourne pas le rowid, et je dois valider la transaction le moins possible que j'ajouter sur quelques millions d'enregistrements !

Juste pour le dossier que je utilise:

  • SQL Server 2008
  • Python
  • pyodbc

Une idée? serait vraiment génial :)

+1

J'aime vos données d'échantillon! – HLGEM

Répondre

4

Vous pouvez le faire dans une instruction de lot:

declare @key as int; 
insert into users (username) 
values ('malcom.reynolds'); 
set @key = (select scope_identity()); 
insert into spaceships (name, owner) 
values ('Serenity', @key) 
+0

merci d'ajouter la ligne 'declare', cela a fonctionné parfaitement! :) – RadiantHex

4

Vous pouvez utiliser le T-SQL scope_identity pour retourner le nouvel ID de la première déclaration INSERT.

Avant votre première INSERT, déclarer une variable pour maintenir la valeur de la nouvelle ID:

DECLARE @ReturnValue int; 

Juste après votre première INSERT, ajoutez ce paramètre pour définir la valeur de cette variable:

SELECT @ReturnValue = scope_identity()

Ensuite, vous pouvez utiliser la variable @ReturnValue dans votre deuxième INSERT à la place de:

INSERT INTO spaceships (name, owner) 
VALUES ('Serenity', @ReturnValue) 
+0

merci pour votre réponse génial, cela n'a pas fonctionné au départ car j'ai dû déclarer la variable et je suis un peu inexpérimenté avec T-SQL. Merci pour les explications: D – RadiantHex

+0

@RadiantHex: Merci pour les commentaires. J'ai mis à jour mon exemple pour les futurs lecteurs. – DOK

2

Ou vous pouvez utiliser la sortie. C'est hadnier quand vous devez retourner plus d'un champ ou faites un insert multitrow pour commencer. Vous pouvez utiliser une variable de table si vous utilisez plusieurs lignes au lieu d'une variable int.

DECLARE @key int 
insert into users (username) 
output inserted.userid 
values ('malcom.reynolds'); 

insert into spaceships (name, owner) 
values ('Serenity', @key)