2011-07-18 3 views
0

J'essaie d'exporter des données à partir d'une feuille de calcul Excel dans une base de données relationnelle assez complexe. La feuille de calcul indique les "clés étrangères" en indiquant les noms des autres objets. (Heureusement, j'ai un peu de contrôle sur la feuille de calcul, donc je peux garantir que ces noms sont uniques et que les objets qu'ils référencent existent réellement).Ajout de clés étrangères à une base de données existante

J'ai un programme qui peut recréer ces tables dans une base de données MSSql, mais il ne peut pas les lier automatiquement les unes aux autres. De plus, je ne veux pas utiliser les noms réels des objets comme clé primaire puisque la base de données sera éventuellement grande. Donc, si j'ai beaucoup de tables existantes mais non connectées qui se réfèrent entre elles par leurs champs "name", comment puis-je ajouter une clé étrangère qui les relie par leurs IDs?

Une version simplifiée de ce que j'ai:

Parent 
ID: 1 (PK) 
Name: Mary 

Child 
ID: 2 (PK) 
Name: Jane 
ParentName: Mary 

Et ce que je veux atteindre:

Child 
ID: 2 (PK) 
Name: Jane 
ParentID: 1 (FK) 

Merci pour toute aide! Je n'ai pas pu trouver un exemple de comment ajouter un mappage de clé étrangère après le fait, ou sur un champ différent.

+0

S'agit-il d'une opération ponctuelle ou devrez-vous importer régulièrement des données de cette feuille de calcul? –

+0

@Catcall: Je dois le faire régulièrement. –

Répondre

4

Voir la syntaxe ALTER TABLE pour MSSQL. Vous pouvez venir avec quelque chose comme ceci pour ajouter la contrainte à la table:

ALTER Child 
ADD CONSTRAINT Child_Parent_FK FOREIGN KEY (ParentID) REFERENCES Parent(ID) 

Ensuite, une fois que la contrainte est, essayez quelque chose comme:

UPDATE Child 
SET ParentID = (SELECT ID FROM Parent WHERE Name = ParentName) 

Cela devrait fonctionner si vous pouvez garantir la Name du Parent est unique. Sinon, vous pouvez ajouter LIMIT 1 à la fin de la requête. Mais s'il y a plusieurs parents avec le même Name, vous devrez ajouter une logique supplémentaire (qui n'est pas spécifiée dans votre message d'origine).

+0

Comment cela répond-il à la question? – Olaf

+0

Oh, oui. Je suppose qu'il manque un peu. Laissez-moi en ajouter d'autres. – Dirk

+0

Je crois que le problème auquel OP fait face est que la feuille de calcul Excel contient le nom du parent, mais la table de base de données devrait contenir l'ID du parent. – Olaf

1

Comme vous allez le faire régulièrement, je pense que vous devriez importer dans une table de transfert. J'aime isoler les tables de transfert dans leur propre schéma.

Utilisez la table de transfert pour récupérer ou générer les clés dont vous avez besoin, puis insérez/mettez à jour vos tables OLTP en fonction des données de la table de transfert. Enfin, tronquez la table de transfert.

+0

Merci! Ce n'est pas une réponse directe à ma question initiale, mais c'est ce que j'ai fini par faire. :) –

+0

Ce n'est pas mon premier rodéo. Je connais la différence entre répondre à une question et résoudre un problème. (Voir http://meta.stackexchange.com/q/66377/161666) Je ne demande pas de points, mais vous pouvez modifier la réponse que vous voulez, et vous pouvez changer votre réponse acceptée à tout moment. –

+0

Je vais certainement upvote cette suggestion dès que j'aurai assez de "réputation"! :) –

Questions connexes