SQL: Insérer des données à partir d'une autre table dans une table qui contient les clés étrangères
Dans une BASE de données SQL
J'ai une Table Utilisateurs
Id Name Age AddressId
----+------+------+-----------
Où AddressId est une clé étrangère d'une table des noms Adresses
La Table Des Adresses:
Id Country State City ZipCode
----+---------+------+------+---------
C'est un ONE-to-ONE Relation: Chaque Utilisateur Dispose de 1 adresse et a chaque adresse d'un utilisateur
J'ai une nouvelle table nommée NEWUsers
Id Name
----+------
Il a seulement le Nom et l'Identifiant.
Ce que je veux faire, c'est ceci:
Écrire un script pour insérer tous les enregistrements De la NEWUSers Table dans la Table des Utilisateurs.
- Je veux L'Âge à la valeur par défaut de 20 pour tous les nouveaux utilisateurs
- Et pour chaque nouvel utilisateur inséré j'ai besoin de créer un nouvel enregistrement d'Adresse pour lui
- la nouvelle Adresse ont tous des valeurs (pays, ville, état, code postal) égal à "abcd" à l'exception de l'Identifiant qui sera utilisé pour définir la clé étrangère AddressId pour le nouvel utilisateur)
Comment puis-je le faire?
J'ai essayé le suivant:
INSERT INTO Users(Name, Age)
Values((SELECT Name FROM NewUsers),20)
Mais je ne sais pas comment créer une nouvelle Adresse d'enregistrement pour chaque utilisateur inséré et spécifier la clé étrangère en conséquence.
Merci beaucoup pour toute aide
Adresses.Id
un IDENTITY
?pour créer une nouvelle adresse lorsque vous insérez de nouvelles
User
vous devez décider de créer trigger
qui sera exécuter après l'insertion d'un nouvel Utilisateur.oui, c'est l'Identité
OriginalL'auteur Youssef | 2012-05-24
Vous devez vous connecter pour publier un commentaire.
Une méthode serait avec deux requêtes, formé comme suit:
Edit: Un moyen simple de relier les utilisateurs à l'adresse serait de mettre temporairement le pays du nom de l'utilisateur. Ensuite, vous avez un lien pour déterminer la addressId. Une fois que les utilisateurs de table est remplie et reliés correctement, vous pouvez définir l'arrière-pays à la valeur par défaut
abcd
:Démo: http://www.sqlfiddle.com/#!3/1f09b/8
Il y a de plus complexe, de façons de le faire si vous voulez garantir la cohérence des transactions si plusieurs insertions peuvent se produire simultanément, ou si vous souhaitez autoriser les doublons de noms, etc. Mais en se fondant sur l'exemple que vous avez donné et les détails jusqu'à présent, cette méthode devrait fonctionner.
OriginalL'auteur mellamokb
C'est un peu hacky, mais est-ce que vous voulez dans deux déclarations - en supposant qu'aucun utilisateur va avoir le nom de 'abcd' ou entrer que pour leur pays, et que vous purger le NewUsers table après cette opération:
OUTPUT
clause 🙂OriginalL'auteur Aaron Bertrand
Vous Devez Écrire le Curseur Pour Insérer des Utilisateurs et de la Table d'Adresses Avec Forign clé
OriginalL'auteur mehdi lotfi
En supposant que vous pouvez définir le AddressId toutefois vous voulez...
Si AddressId est une colonne d'identité, vous pouvez désactiver l'identité temporairement en premier. Voir SET IDENTITY_INSERT pour plus d'informations et des exemples.
OriginalL'auteur Daniel Renshaw
Honnêtement, la réponse est que vous ne voulez pas faire ce que vous pensez que vous voulez faire. Si les utilisateurs ont une et une seule adresse, comme vous l'avez indiqué, alors vous devriez avoir une seule table (utilisateurs) qui contient les champs de l'adresse. La modélisation de vos données correctement fera ce problème intrinsèquement.
OriginalL'auteur HardCode