Como posso saber se CONSTRAINT_NAME é uma chave primária ou do Exterior?
-
23-08-2019 - |
Pergunta
Usando este SQL no SQL Server 2005
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
Eu recebo as chaves primárias e as chaves estrangeiras.
Como posso obter apenas chaves estrangeiras? Como posso ver se a restrição é uma primária ou uma chave estrangeira?
Graças
Solução 2
Eu usei o seguinte SQL com o SQL Server 2005 para obter os nomes de restrição de chave primária:
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)
Para obter o nome da restrição por Estrangeira chave:
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName
Para obter tabela e campo da chave estrangeira restrição Nome:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME = @ConstraintName
Para obter tabela e campo da chave primária por constrangimento 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)
Outras dicas
Encontrada uma solução muito mais elegante aqui
código adicionado abaixo para ser completo, mas todo o crédito vai para 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 você quiser apenas as chaves primárias ...
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
Adicionado isso como uma resposta adicional porque está tão distante da minha anterior:)
Depende do seu DBMS, mas uma restrição deve ter a tabela de destino e coluna em algum lugar.
Se for uma restrição de chave estrangeira, a tabela de destino será diferente para a tabela atual. Tentar
select *
em vez de
select constraint_name
para ver todas as colunas mágicas você pode trabalhar com ele.
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
AND REFERENCED_COLUMN_NAME IS NOT NULL
Não é o mais elegante de soluções, mas MS SQL Server usa o PK e FK prefixo de nome convenção para chaves para que você poderia usar algo como ...
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'
Se esse é seu DBMS:)
Editar
Quando eu tentei a resposta por Quassnoi eu tenho um "nome de coluna inválido 'REFERENCED_COLUMN_NAME'." erro.
Eu uso algo parecido. Ele funciona no SQL Server 2000 também.
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
É tudo em tabelas do sistema e pontos de vista que são muito bem documentados.