¿Cómo sé si CONSTRAINT_NAME es una clave principal o extranjera?
-
23-08-2019 - |
Pregunta
El uso de este SQL en SQL Server 2005
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
consigo las claves primarias y las claves externas.
¿Cómo puedo obtener sólo claves externas? ¿Cómo puedo saber si una restricción es una primaria o una clave externa?
Gracias
Solución 2
He utilizado el siguiente código SQL con SQL Server 2005 para obtener los nombres de restricción de clave principal:
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 obtener el nombre de la restricción por Foreing Clave:
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName
Para obtener tablas y campos de la clave externa por Restricción Nombre:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME = @ConstraintName
Para obtener tablas y campos de la clave principal por Nombre de restricción:
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)
Otros consejos
encontrado una solución mucho más elegante aquí
Código añadió a continuación está completo, pero todo el crédito va a Pinal de 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
Y si lo que desea las claves primarias ...
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ñadido esto como una respuesta adicional, ya que está tan lejos de mi anterior:)
depende de su DBMS, pero una restricción debe tener la tabla de destino y la columna en alguna parte.
Si se trata de una restricción de clave externa, la tabla de destino será diferente a la tabla actual. Trate
select *
en lugar de
select constraint_name
para ver todas las columnas mágicas que puede trabajar.
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
AND REFERENCED_COLUMN_NAME IS NOT NULL
No es el más elegante de soluciones, pero MS SQL Server utiliza el prefijo PK y FK convención de nomenclatura para las claves de lo que podría utilizar algo como ...
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'
Si ese es su DBMS:)
Editar
Cuando probé la respuesta por Quassnoi recibí un "nombre de columna no válido 'REFERENCED_COLUMN_NAME'." error.
utilizo algo por el estilo. Funciona en SQL Server 2000 también.
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
Todo está en las tablas del sistema y puntos de vista que están bastante bien documentadas.