[mysql] 테이블에 제한 조건 표시 명령

PK FK 관계 설정을 시도한 테이블이 있지만이를 확인하고 싶습니다. PK / FK 제한을 표시하려면 어떻게해야합니까? 내가 본 매뉴얼 페이지를하지만 예를 표시하지 않습니다 내 구글 검색도 보람이었다. 내 데이터베이스는 credentialing1있고 제한된 테이블은 practicescred_insurances입니다.



답변

나는 사용한다

SHOW CREATE TABLE mytable;

mytable현재 양식 으로 취소 하는 데 필요한 SQL 문이 표시 됩니다. 모든 열과 해당 유형 (예 :)을 볼 수 DESC있지만 제약 정보 (및 테이블 유형, 문자 집합 등)도 표시합니다.


답변

INFORMATION_SCHEMA를 쿼리하면됩니다.

USE INFORMATION_SCHEMA;
SELECT TABLE_NAME,
       COLUMN_NAME,
       CONSTRAINT_NAME,
       REFERENCED_TABLE_NAME,
       REFERENCED_COLUMN_NAME
FROM KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "<your_database_name>" 
      AND TABLE_NAME = "<your_table_name>" 
      AND REFERENCED_COLUMN_NAME IS NOT NULL;


답변

검증 된 답변의 주요 문제는 정보를 얻으려면 출력을 구문 분석해야한다는 것입니다. 다음은보다 유용한 방식으로 얻을 수있는 쿼리입니다.

SELECT cols.TABLE_NAME, cols.COLUMN_NAME, cols.ORDINAL_POSITION,
cols.COLUMN_DEFAULT, cols.IS_NULLABLE, cols.DATA_TYPE,
    cols.CHARACTER_MAXIMUM_LENGTH, cols.CHARACTER_OCTET_LENGTH,
    cols.NUMERIC_PRECISION, cols.NUMERIC_SCALE,
    cols.COLUMN_TYPE, cols.COLUMN_KEY, cols.EXTRA,
    cols.COLUMN_COMMENT, refs.REFERENCED_TABLE_NAME, refs.REFERENCED_COLUMN_NAME,
    cRefs.UPDATE_RULE, cRefs.DELETE_RULE,
    links.TABLE_NAME, links.COLUMN_NAME,
    cLinks.UPDATE_RULE, cLinks.DELETE_RULE
FROM INFORMATION_SCHEMA.`COLUMNS` as cols
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS refs
ON refs.TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND refs.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND refs.TABLE_NAME=cols.TABLE_NAME
    AND refs.COLUMN_NAME=cols.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cRefs
ON cRefs.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA
    AND cRefs.CONSTRAINT_NAME=refs.CONSTRAINT_NAME
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS links
ON links.TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND links.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND links.REFERENCED_TABLE_NAME=cols.TABLE_NAME
    AND links.REFERENCED_COLUMN_NAME=cols.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cLinks
ON cLinks.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA
    AND cLinks.CONSTRAINT_NAME=links.CONSTRAINT_NAME
WHERE cols.TABLE_SCHEMA=DATABASE()
    AND cols.TABLE_NAME="table"


답변

afaik에게 요청 information_schema하려면 권한이 필요합니다. 간단한 키 목록이 필요한 경우이 명령을 사용할 수 있습니다.

SHOW INDEXES IN <tablename>


답변

시도해보십시오 :

SHOW TABLE STATUS FROM credentialing1;

외래 키 제약 조건은 출력 의 주석 열에 나열됩니다 .


답변

이것을 사용할 수 있습니다 :

select
    table_name,column_name,referenced_table_name,referenced_column_name
from
    information_schema.key_column_usage
where
    referenced_table_name is not null
    and table_schema = 'my_database' 
    and table_name = 'my_table'

또는 더 나은 형식의 출력을 위해 다음을 사용하십시오.

select
    concat(table_name, '.', column_name) as 'foreign key',  
    concat(referenced_table_name, '.', referenced_column_name) as 'references'
from
    information_schema.key_column_usage
where
    referenced_table_name is not null
    and table_schema = 'my_database' 
    and table_name = 'my_table'


답변

@ Resh32 와 유사 하지만 USE명령문 을 사용할 필요가 없습니다 .

SELECT TABLE_NAME,
       COLUMN_NAME,
       CONSTRAINT_NAME,
       REFERENCED_TABLE_NAME,
       REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "database_name" 
      AND TABLE_NAME = "table_name" 
      AND REFERENCED_COLUMN_NAME IS NOT NULL;

예를 들어 ORM을 사용하는 것이 좋습니다.