TSQL의 고유 제약 조건 열 목록을 가져오시겠습니까?
다음 쿼리를 사용하여 고유 제약 조건 목록을 매우 쉽게 얻을 수 있습니다.
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='UNIQUE'
그러나 각 고유 제약 조건이 적용되는 열 목록을 가져오려면 어떻게 해야 합니까?
Ed가 맞습니다. 열은 제약 조건 열 사용 보기에 표시됩니다. 여기에 대한 SQL이 있습니다.
select TC.Constraint_Name, CC.Column_Name from information_schema.table_constraints TC
inner join information_schema.constraint_column_usage CC on TC.Constraint_Name = CC.Constraint_Name
where TC.constraint_type = 'Unique'
order by TC.Constraint_Name
봐INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
SELECT *
FROM sys.indexes i
JOIN sys.index_columns ic
ON i.index_id = ic.index_id
AND i.object_id = ic.object_id
WHERE i.is_unique_constraint = 1;
네크로맨싱.
정보_SCHEMA.CONSTRAINT_COLUM_USAGE는 엄청나게 느립니다.
sys.index를 사용하여 테이블, 스키마, 객체를 결합하고, 추가 보너스로 고유 제약 조건뿐만 아니라 필터를 포함한 고유 인덱스도 얻을 수 있습니다.
-- CREATE TABLE dbo.T_User( USR_ID int NOT NULL, USR_User nvarchar(256) NULL, USR_Status int NOT NULL );
-- ALTER TABLE dbo.T_User ADD CONSTRAINT UC_T_User_USR_User UNIQUE(USR_User)
-- IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.T_User') AND name = N'IX_T_User_USR_User')
-- CREATE UNIQUE INDEX IX_T_User_USR_User ON dbo.T_User(USR_User)
-- WHERE (USR_User IS NOT NULL AND USR_Status=(1))
SELECT
sch.name
,st.name
,i.name
,i.has_filter
,i.filter_definition
,i.is_unique
,i.is_primary_key
,i.is_unique_constraint
,CASE WHEN i.is_unique_constraint = 1
THEN N'ALTER TABLE ' + QUOTENAME(sch.name) + N'.' + QUOTENAME(st.name) + N' DROP CONSTRAINT ' + QUOTENAME(i.name) + N'; '
ELSE N'DROP INDEX ' + QUOTENAME(i.name) + N' ON ' + QUOTENAME(sch.name) + '.' + QUOTENAME(st.name) + '; '
END AS sql
FROM sys.indexes AS i
INNER JOIN sys.index_columns AS ic
ON i.index_id = ic.index_id
AND i.object_id = ic.object_id
INNER JOIN sys.tables AS st
ON st.object_id = i.object_id
INNER JOIN sys.objects AS syso
ON syso.object_id = st.object_id
AND syso.is_ms_shipped = 0
INNER JOIN sys.schemas AS sch
ON sch.schema_id = st.schema_id
WHERE (1=1)
AND NOT EXISTS
(
SELECT *
FROM sys.extended_properties AS xp
WHERE xp.minor_id = 0
AND xp.major_id = st.object_id
AND xp.name = 'microsoft_database_tools_support'
)
-- AND sch.name = 'dbo'
-- AND st.name = 'T_Benutzer'
AND
(
i.is_unique_constraint = 1
OR
(i.is_unique = 1 AND i.is_primary_key = 0)
)
;
mySQL 사용자를 참조하기 위해 아래 쿼리에서도 동일한 작업을 수행할 수 있습니다.
표에서 고유한 제약 조건 찾기
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='UNIQUE' and table_name='db_my_table'
모든 열이 있는 고유한 열 리스트를 찾는 방법
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_NAME='cons_name' and TABLE_NAME='db_my_table'
필요한 보기가 있는 고유한 열 목록 찾기
select CONSTRAINT_NAME,COLUMN_NAME,TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_NAME='cons_name' and TABLE_NAME='db_my_table'
ASC/DESC 플래그가 추가된 적절한 정렬 순서로 제약 조건 열을 나열하는 더 나은 솔루션이 있습니다.또한 카탈로그, 스키마 또는 테이블 이름별로 필터링할 수 있습니다.
SELECT sh.name AS schema_name,
i.name AS constraint_name,
t.name AS table_name,
c.name AS column_name,
ic.key_ordinal AS column_position,
ic.is_descending_key AS is_desc
FROM sys.indexes i
INNER JOIN sys.index_columns ic
ON i.index_id = ic.index_id AND i.object_id = ic.object_id
INNER JOIN sys.tables AS t
ON t.object_id = i.object_id
INNER JOIN sys.columns c
ON t.object_id = c.object_id AND ic.column_id = c.column_id
INNER JOIN sys.objects AS syso
ON syso.object_id = t.object_id AND syso.is_ms_shipped = 0
INNER JOIN sys.schemas AS sh
ON sh.schema_id = t.schema_id
INNER JOIN information_schema.schemata sch
ON sch.schema_name = sh.name
WHERE i.is_unique_constraint = 1
-- AND sch.catalog_name = 'EmployeesQX'
-- AND sh.name = 'dbo'
ORDER BY sh.name, i.name, ic.key_ordinal;
언급URL : https://stackoverflow.com/questions/2675168/get-the-unique-constraint-columns-list-in-tsql
'programing' 카테고리의 다른 글
VSTO 솔루션을 구축 및 공유하는 방법에 대한 최상의 컨텐츠 (0) | 2023.08.30 |
---|---|
Pphmyadmin에 대한 사용자 입력이 있는 SQL 삽입 문이 작동하지 않습니다. (0) | 2023.08.30 |
"스레드 세이프"가 정말 의미하는 것은...실용적인 용어로 (0) | 2023.08.30 |
ASP.NET MVC "Ajax.BeginForm"은 모델이 유효하지 않더라도 OnSuccess를 실행합니다. (0) | 2023.08.30 |
도커 구성에서 호스트 디렉토리를 볼륨으로 마운트하려면 어떻게 합니까? (0) | 2023.08.30 |