Comment insérer des valeurs dans les deux tables avec une relation de clé étrangère?
J'ai créé deux tables:
-
Table
tblStaff
avec des colonnesid
(clé primaire, auto increment),name
,age
,address
-
Table
tblRoleOfStaff
avec des colonnesid
(clé primaire, auto increment),StaffId
(clé étrangère àtblStaff
),RoleId
J'ai la forme pour créer de nouveau personnel existant rôle. Échantillon de données à insérer:
(name, age, address, roleId) = ('my name',20,'San Jose', 1)
Je veux écrire une procédure stockée dans SQL Server 2014 pour insérer de nouveaux employés afin de tblStaff
et insérer un nouvel enregistrement dans tbleRoleOfStaff
avec staffId
j'ai juste inséré.
Que dois-je faire?
Je suis donc désolé si ma question fait doublon avec d'autres. Je suis plus frais en SQL.
Merci pour toute aide.
- SQL Server n'a pas "auto increment". Êtes-vous sûr de savoir ce que la base de données que vous utilisez?
- Merci Gordon Linoff, je suis à l'aide de SQL Server Management Studio et j'ai mis l'Id de colonne est de type int et puis en définissant l'identité manuellement avec incrément d'identité avec la valeur est de 1.
- C'est généralement appelée "identité" de la colonne dans SQL Server; un "auto increment" colonne MySQL; une "série" colonne dans Postgres. Ils sont tous de la même chose, mais à chaque base de données possède une syntaxe différente.
Vous devez vous connecter pour publier un commentaire.
Utilisation SCOPE_IDENTITY() deuxième insérer dans
tblRoleOfStuff
sur un lieu deStaffId
. Comme:MODIFIER
Il y a trop de commentaires sur cette réponse, donc je veux donner une explication.
Si OP garantit qu'il n'utilisera pas tous les déclencheurs, il peut utiliser
@@IDENTITY
(mauvaise pratique), il suffit à ses besoins, mais de l'utilisation de laSCOPE_IDENTITY()
.SCOPE_IDENTITY()
permettra de garantir que vous obtenez de l'identité à partir de l'opération en cours, non pas à partir d'une autre connexion ou la dernière à être traitée.Pourquoi ne pas
IDENT_CURRENT
? Parce queAfin de vous faire prendre de la dernière portée, mais pas en cours. Oui, l'OP peut l'utiliser aussi, mais c'est une mauvaise pratique dans cette situation (comme l'utilisation de seulement
@@IDENTITY
)À l'aide de
OUTPUT
est en effet bien pratique, mais plus compliqué pour une seule identité. Si les OP ont besoin de traiter plus d'une ligne dans un temps - oui, il a besoinOUTPUT
.SCOPE_IDENTITY()
au lieu de quoi que ce soit d'autre (comme@@IDENTITY
) pour saisir la nouvelle valeur d'identité insérée. Voir ce billet de blog pour expliquer POURQUOISCOPE_IDENTITY()
/@@IDENTITY
sans aucun problème. - Je ajouter des informations sur les déclencheurs dans ma réponse ainsi. Merci pour remarquer!Car il semble que vous discutez de 1 ligne à la fois certaines personnes peuvent vous dire d'utiliser un système vairable comme
@@IDENTITY
ou certains des autres mais de s'assurer avec plus de certitude, je recommande leOUTPUT
clause de l'instruction insert. La bonne chose à propos de cette méthode est qu'il peut facilement être adapté pour gérer plus de 1 ligne à la fois.Raisons de ne pas utiliser
@@IDENTITY
en cas d'une autre opération liée à la vôtre est effectuée. E. g. un déclencheur insère une ligne dans une autre table, ou met à jour un autre enregistrement dans votre base de données.,SCOPE_IDENTITY
a le même manque à gagner lorsqu'un déclencheur modifie de la même table.IDENT_CURRENT
dispose d'un court de venir aussi. Faire une recherche sur internet pour en savoir plus il y a des tonnes de ressources sur ces.Vous pouvez utiliser
output
à partir de votre première instruction insert.Vous pouvez insérer plusieurs rôles à la fois en tant que bien.
Après l'insertion dans le premier tableau, utilisez quelque chose comme
Id
- autres plaquettes peut passé avant, vous obtenez une chance de lire cette valeur!Essayez ceci:
Veuillez noter les différences entre les
IDENT_CURRENT
,SCOPE_IDENTITY
et@@IDENTITY
. Lire à ce sujet IciSCOPE_IDENTITY
dans cet article est lié à: afin D'éviter les problèmes liés à l'ajout d'un déclencheur plus tard, toujours utiliser SCOPE_IDENTITY() pour retourner l'identité de la récemment ajouté la ligne dans votre T Instruction SQL ou une procédure stockée.