2009-09-03 5 views
5

Est-ce que quelqu'un sait comment je peux voir quelles sont les principales clés étrangères & dans une table?SQL Server 2008: trouvez la clé primaire/étrangère dans la table?

EDIT: Merci pour toutes les réponses. Je cherchais une requête SQL pour le faire. En ce moment je joue avec l'écriture d'un outil qui peut me lister toutes les tables d'une DB et montrer les colonnes. J'aimerais aussi afficher quelles clés sont les clés primaires.

Voilà comment je lis le tableau Catalogue:

const string sqlSelectTable = "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE " + 
             "FROM INFORMATION_SCHEMA.TABLES " + 
             "WHERE TABLE_TYPE = 'BASE TABLE' " + 
             "ORDER BY TABLE_TYPE,TABLE_NAME"; 

Et voilà comment je reçois les Infos sur une colonne:

const string sqlSelectTable = 
      "SELECT  COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH " + 
      "FROM   INFORMATION_SCHEMA.COLUMNS " + 
      "WHERE  (TABLE_NAME = @TABLE_NAME) " + 
      "ORDER BY ORDINAL_POSITION"; 

Est-ce que je dois créer un Inner-Join donc voir laquelle des colonnes est la clé primaire?

Vive

Répondre

11

Pour la clé primaire sur chaque table, vous pouvez utiliser cette requête:

SELECT 
    kc.name, 
    c.NAME 
FROM 
    sys.key_constraints kc 
INNER JOIN 
    sys.index_columns ic ON kc.parent_object_id = ic.object_id 
INNER JOIN 
    sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id 
WHERE 
    kc.type = 'PK' 

et pour la clé étrangère, je crois que cette requête devrait vous fournir les informations nécessaires:

SELECT 
    OBJECT_NAME(parent_object_id) 'Parent table', 
    c.NAME 'Parent column name', 
    OBJECT_NAME(referenced_object_id) 'Referenced table', 
    cref.NAME 'Referenced column name' 
FROM 
    sys.foreign_key_columns fkc 
INNER JOIN 
    sys.columns c 
     ON fkc.parent_column_id = c.column_id 
      AND fkc.parent_object_id = c.object_id 
INNER JOIN 
    sys.columns cref 
     ON fkc.referenced_column_id = cref.column_id 
      AND fkc.referenced_object_id = cref.object_id 

Marc

+0

Non qui ne fonctionne pas. Il renvoie tous les index que vous avez créés. – Craig

+0

@Craig: requête # 1 ** seulement ** renvoie les clés primaires - requête # 2 renvoie ** seulement ** clés étrangères - ou qu'est-ce que vous obtenez ?? –

3

Dans Management Studio, développez la table, puis développez l'élément Colonnes. La clé primaire (s) a une icône de clé à côté d'eux.

Pour voir les clés étrangères, développez l'élément Contraintes.

1

Vous pouvez commencer par:

SELECT 
    Table_Name as [TableName], 
    Column_Name as [ColumnName], 
    Constraint_Name as [Constraint], 
    Table_Schema as [Schema] 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
ORDER BY 
    [TableName], 
    [ColumnName] 

(vous pouvez filtrer puis par tableName)

1
SELECT 
OBJECT_NAME(parent_object_id) 'Parent table', 
c.NAME 'Parent column name', 
OBJECT_NAME(referenced_object_id) 'Referenced table', 
cref.NAME 'Referenced column name' 
FROM 
sys.foreign_key_columns fkc 
INNER JOIN 
sys.columns c 
    ON fkc.parent_column_id = c.column_id 
     AND fkc.parent_object_id = c.object_id 
INNER JOIN 
sys.columns cref 
    ON fkc.referenced_column_id = cref.column_id 
     AND fkc.referenced_object_id = cref.object_id where OBJECT_NAME(parent_object_id) = 'tablename' 

Si vous souhaitez obtenir la relation clé étrangère de toutes les tables ne comprennent pas la clause where écrire bien votre tablename au lieu de tablename

Questions connexes