Comment puis-je savoir si CONSTRAINT_NAME est un primaire ou clé étrangère?
-
23-08-2019 - |
Question
L'utilisation de ce SQL sur SQL Server 2005
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
Je reçois les clés primaires et les clés étrangères.
Comment puis-je obtenir seulement les clés étrangères? Comment puis-je voir si une contrainte est un primaire ou une clé étrangère?
Merci
La solution 2
J'utilisé l'instruction SQL suivante avec SQL Server 2005 pour obtenir les noms par contrainte de clé primaire:
SELECT Constraint_Name
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
WHERE UNIQUE_CONSTRAINT_NAME =
(SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)
Pour obtenir le nom Constraint par Etrangère Key:
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName
Pour la table et de la clé étrangère par Nom Champ Contrainte:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME = @ConstraintName
Pour la Table clé primaire et sur le terrain par Nom Constraint:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME =
(SELECT UNIQUE_CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_NAME = @ConstraintName)
Autres conseils
trouvé une solution beaucoup plus élégante ici
code ajouté ci-dessous pour être complet, mais tout le crédit va à Pinal Dave
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id,
fc.parent_column_id) AS ColumnName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id,
fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
LEFT JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
Et si vous voulez juste les clés primaires ...
SELECT i.name AS IndexName,
OBJECT_NAME(ic.OBJECT_ID) AS TableName,
COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
FROM sys.indexes AS i
INNER JOIN sys.index_columns AS ic
ON i.OBJECT_ID = ic.OBJECT_ID
AND i.index_id = ic.index_id
WHERE i.is_primary_key = 1
a ajouté comme une réponse supplémentaire, car il est si loin de ma précédente:)
Cela dépend de votre SGBD, mais une contrainte doit avoir la table cible et de la colonne quelque part.
Si elle est une contrainte de clé étrangère, la table cible sera différente de la table en cours. Essayez
select *
au lieu de
select constraint_name
pour voir toutes les colonnes magiques que vous pouvez travailler avec.
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
AND REFERENCED_COLUMN_NAME IS NOT NULL
Ce n'est pas la plus élégante des solutions, mais MS SQL Server utilise la convention de nommage préfixe PK et FK pour les clés pour que vous puissiez utiliser quelque chose ...
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'
Si tel est votre SGBD:)
EDIT
Quand j'ai essayé la réponse par Quassnoi Je suis un « nom de colonne non valide « REFERENCED_COLUMN_NAME ». » erreur.
J'utilise quelque chose comme ça. Il fonctionne dans SQL Server 2000 ainsi.
select object_name(fkx.constid) as fk_name,
fkx.keyno as num,
object_name(fkx.fkeyid) as child_table,
col_name(fkx.fkeyid, fkx.fkey) as child_column,
object_name(fkx.rkeyid) as parent_table,
col_name(fkx.rkeyid, fkx.rkey) as parent_column
from sysforeignkeys fkx
order by fk_name, fkx.keyno
Il est dans les tables système et des vues qui sont assez bien documentés.