MySQL 데이터베이스의 제약 목록


91

특정 데이터베이스에서 모든 제약 조건 목록을 얻으려면 어떻게합니까?


1
MySQL에는 두 가지 이상의 제약 유형이 있습니다. 무슨 말이야? 당신이 찾고있는 종류의 예를 들어 줄 수 있습니까?
Mark Byers

답변:


145

information_schema.table_constraints테이블을 사용하여 각 테이블에 정의 된 제약 조건의 이름을 가져옵니다.

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB'

information_schema.key_column_usage테이블을 사용하여 각 제약 조건의 필드를 가져옵니다.

select *
from information_schema.key_column_usage
where constraint_schema = 'YOUR_DB'

대신 외래 키 제약 조건에 대해 이야기하는 경우 information_schema.referential_constraints다음을 사용하십시오 .

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'

1
이 목록에는 UNIQUE, PRIMARY KEY 또는 FOREIGN KEY 제약 조건 만 포함됩니다. CHECK는 가능하지만 적용되지는 않습니다. 이 쿼리를 사용하면 DEFAULT 제약 조건이 표시되지 않습니다.
OMG Ponies

MySQL은 CHECK 제약 조건을 저장하지 않습니다. 하나를 정의하려고하면 구문 분석하고 자동으로 버립니다.
Bill Karwin 2010 년

1
DEFAULT 값은 제약 조건으로 간주되지 않습니다. 에 저장됩니다 information_schema.columns.column_default.
Bill Karwin 2010 년

22

@Senseful의 훌륭한 답변입니다.

제약 조건 이름 목록 (다른 세부 정보 / 열 제외) 만 찾는 사람들을 위해 수정 된 쿼리를 제시하고 있습니다.

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;

2
찾은 후 삭제해야하는 경우 여기를 참조하십시오. stackoverflow.com/a/838412/2401804
r3wt

9

이것은 ON_UPDATE 및 ON_DELETE와 같은 제약 조건과 열 및 외부 열 이름을 모두 함께 포함하는 규칙뿐만 아니라 기본 및 외래 키 제약 조건을 확인하려는 경우에 유용합니다.

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule

FROM information_schema.table_constraints tc

inner JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
AND tc.table_name = kcu.table_name

LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
AND tc.table_name = rc.table_name

WHERE tc.constraint_schema = 'my_db_name'

해당 열에 대한 추가 정보를 추가 할 수도 있습니다.이를 SQL에 추가하고 원하는 열을 선택하기 만하면됩니다.

LEFT JOIN information_schema.COLUMNS c
ON kcu.constraint_schema = c.table_schema
AND kcu.table_name = c.table_name
AND kcu.column_name = c.column_name

-3

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";


1
내가 아는 한 이것은 MySQL이 아닌 Oracle에 있습니다.
Pradyumn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.