Come faccio a sapere se CONSTRAINT_NAME è una chiave primaria o estero?
-
23-08-2019 - |
Domanda
L'utilizzo di questo SQL in SQL Server 2005
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
I ottenere le chiavi primarie e le chiavi esterne.
Come posso ottenere solo chiavi esterne? Come posso vedere se un vincolo è un primario o di una chiave esterna?
Grazie
Soluzione 2
Ho usato il seguente SQL con SQL Server 2005 per ottenere i nomi dei vincoli tramite chiave primaria:
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)
Per ottenere il nome del vincolo da Foreing chiave:
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName
Per ottenere Tavola e campo della chiave esterna per costrizione Nome:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME = @ConstraintName
Per ottenere Tavola e campo della chiave primaria per costrizione Nome:
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)
Altri suggerimenti
Trovato una soluzione molto più elegante qui
Codice aggiunto di seguito per completezza, ma tutto il merito va al 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
E se si desidera solo le chiavi primarie ...
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
Aggiunta questa come una risposta ulteriore perché è così lontana dalla mia precedente:)
Dipende dal vostro DBMS ma un vincolo deve avere la tabella di destinazione e la colonna da qualche parte.
Se è un vincolo di chiave esterna, la tabella di destinazione sarà diversa per la tabella corrente. Prova
select *
anziché
select constraint_name
per vedere tutte le colonne magiche si può lavorare.
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
AND REFERENCED_COLUMN_NAME IS NOT NULL
Non è il più elegante di soluzioni, ma MS SQL Server utilizza il prefisso PK e FK convenzione di denominazione per le chiavi così si potrebbe usare qualcosa come ...
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'
Se questo è il vostro DBMS:)
Modifica
Quando ho provato la risposta Quassnoi ho ricevuto una "non valido nome di colonna 'REFERENCED_COLUMN_NAME'." di errore.
Io uso una cosa del genere. Funziona in SQL Server 2000 pure.
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
E 'tutto nelle tabelle di sistema e punti di vista che sono abbastanza ben documentati.