web-dev-qa-db-fra.com

SQL Server Management Studio - ajouter une clé étrangère prête à confusion?

Je trouve toujours confus d'ajouter des clés étrangères à la table primaire dans Management Studio.

Disons que j'ai un

Table1 
{
    ID int, -- Primary Key
    Table2ID int, -- Refers to Table2's ID 
}

Table2 
{
    ID int, -- Primary Key
    SomeData nvarchar(50)
}

J'ajoute une clé étrangère à Table1 par Right Click -> Relationships -> Table and column specification. Je place des popups "primaires" sur Table2, ID et "Table de clés étrangères" sur Table1, Table2ID.

Mes questions:

  1. La table 2 ne doit-elle pas être répertoriée pour la "table de clés étrangères" et la table 1 pour la clé primaire? Ma compréhension est-elle mauvaise?

  2. Lorsque j'enregistre, je reçois une alerte "Les tableaux suivants seront enregistrés dans votre base de données." et il montre les deux tableaux. Je ne comprends vraiment pas cela. J'ai seulement changé Table1. Pourquoi le deuxième tableau est-il affiché?

42
tvr
  • Cliquez sur le symbole de développement à côté du tableau.
  • Faites un clic droit sur le dossier "Clés" et sélectionnez "Nouvelle clé étrangère".
  • (Vous pouvez également cliquer sur le bouton Relations dans la barre d'outils lorsque la table est ouverte)
  • Cliquez sur le bouton "..." de la ligne "Spécifications des tableaux et colonnes" pour ouvrir l'éditeur.
  • Le menu déroulant à gauche sera le tableau à partir duquel vous ajoutez, et le champ de texte statique répertoriera le tableau auquel vous ajoutez.
  • Utilisez les listes déroulantes pour spécifier vos contraintes et assurez-vous que les deux côtés ont le même nombre de colonnes.
103
Zach

Pourquoi n'utilisez-vous pas simplement les instructions T-SQL équivalentes ?? Cela me semble beaucoup plus facile et moins déroutant:

ALTER TABLE dbo.Table1
  ADD CONSTRAINT FK_Table1_Table2
    FOREIGN KEY(Table2ID) REFERENCES dbo.Table2(ID)

Quand je lis ceci, je crois que c'est immédiatement clair quelles sont les deux tables impliquées, et comment elles sont connectées (Table1.Table2ID - (références) -> Table2.ID)

Si vous voulez rester dans le monde du concepteur SSMS: vous pouvez également créer un diagramme de base de données de vos tables impliquées, puis simplement glisser-déposer votre Table2ID colonne de Table1 vers Table2 et déposez-le dans la colonne ID - cela indiquerait graphiquement à SSMS ce que vous voulez faire, et il vous suffit de revoir vos choix et de cliquer sur OK dans la boîte de dialogue qui apparaît.

22
marc_s

1. La table 2 ne doit-elle pas être répertoriée pour la "table de clés étrangères" et la table 1 pour la clé primaire? Ma compréhension est-elle mauvaise?

Je crois que votre compréhension est fausse. Table2 est la table dont vous faites référence à la clé primaire. Par conséquent, il est répertorié sous Clé primaire. Table1 est la table qui aura la clé étrangère (la référence à la clé primaire d'une autre table); par conséquent, il est répertorié sous "Table de clés étrangères".

En ce qui concerne la raison pour laquelle les deux tables sont enregistrées, même si la clé étrangère est répertoriée par la suite comme appartenant à Table1: je pense que c'est parce que la clé étrangère contraint les deux tables. Ils doivent tous les deux "connaître" la contrainte, ils doivent donc tous les deux être enregistrés.

9
Ann L.
ALTER TABLE dbo.Table1
  ADD CONSTRAINT FK_Table1_Table2
    FOREIGN KEY(Table2ID) REFERENCES dbo.Table2(ID)
1
Deepesh