제약 _name이 기본 또는 외국 키인지 어떻게 알 수 있습니까?
-
23-08-2019 - |
문제
SQL Server 2005 에서이 SQL을 사용합니다
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
기본 키와 외래 키를 얻습니다.
외국 열쇠 만 얻으려면 어떻게해야합니까? 제약 조건이 기본 또는 외국 키인지 어떻게 알 수 있습니까?
감사
해결책 2
SQL Server 2005와 함께 다음 SQL을 사용하여 기본 키로 제약 조건 이름을 얻었습니다.
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)
열쇠를 잡아 제약 이름을 얻으려면 :
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName
제약으로 외국 키의 테이블과 필드를 얻으려면 :
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME = @ConstraintName
제약 이름으로 기본 키의 테이블과 필드를 얻으려면 :
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)
다른 팁
훨씬 더 우아한 솔루션을 찾았습니다 여기
완전성을 위해 아래에 추가되었지만 모든 크레딧은 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
그리고 당신이 기본 키를 원한다면 ...
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
지금까지 내 이전 판에서 제거 되었기 때문에 이것을 추가 답변으로 추가했습니다. :)
DBM에 따라 다르지만 제약 조건에는 대상 테이블과 열이 어딘가에 있어야합니다.
외국 키 제약 조건 인 경우 대상 테이블은 현재 테이블과 다릅니다. 노력하다
select *
대신에
select constraint_name
작업 할 수있는 모든 마법 기둥을 보려면.
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND COLUMN_NAME=@ColumnName
AND REFERENCED_COLUMN_NAME IS NOT NULL
가장 우아한 솔루션은 아니지만 MS SQL Server는 PK & FK Prefix 이름 지정 컨벤션을 사용하여 같은 것을 사용할 수 있습니다.
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @TableName
AND LEFT(CONSTRAINT_NAME,2) = 'FK'
그것이 당신의 dbms라면 :)
편집하다
Quassnoi의 답을 시도했을 때 "유효하지 않은 열 이름 '참조 _column_name'을 얻었습니다. 오류.
나는 그런 것을 사용합니다. SQL Server 2000에서도 작동합니다.
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
그것은 모두 잘 문서화 된 시스템 테이블과보기에 있습니다.