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


224

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

답변:


414

나는 사용한다

SHOW CREATE TABLE mytable;

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


8
나는 그것이 들어오는 fk 관계를 보여주지 않는다고 생각합니까? 예를 들면,로 a.col_one references b.col_one하고있는 show create table b상기 관계에 대한 세부 사항을 포함하지 않을 것이다.
Vineet Menon

1
이 명령이 외래 키 제약 조건을 표시하지 않음을 확인했습니다.
Kemin Zhou

2
10.2로 시작하는 MariaDB는 여기에 어색한 결과를 반환합니다. jira.mariadb.org/browse/MDEV-15377
스탬 스터

117

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;

14
프로그래밍 방식으로 사용할 수있는 형식으로 결과를 제공하기 때문에 이것이 가장 좋은 대답입니다. 물론 결과를 좁히려면 WHERE 절을 추가해야합니다.
Naveed Hasan

이것은 여러 외래 키를 참조하는 열 'id'가있는 손상된 테이블을 찾는 데 도움이되었습니다. 테이블에 1452 IntegrityError가 발생했습니다.
Vicky T

이것은 좋은 대답입니다! 감사합니다 @ Resh32
simhumileco

답에 "간단히"라는 접두사를 붙여서 정말 좋습니다. 그래도 좋은 대답입니다!
leviathanbadger

실제 제약 조건 규칙을 표시하지 않습니다 (예ON UPDATE CASCADE
Stamster

19

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

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"

11

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

SHOW INDEXES IN <tablename>

방법 INFORMATION_SCHEMA이보다 더 많이 감사 호출
Eiad Samman을

6

시도해보십시오 :

SHOW TABLE STATUS FROM credentialing1;

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


3
주석 열에는 표 주석 만 표시됩니다. 아마도 InnoDB 유형과 관련이 있습니다.
clockworkgeek

1
의견은 사용자 의견만을위한 것입니다. FK 정의가 저장되는 곳은 아닙니다! 그들이 당신을 위해 있다면-그것은 당신을 대신하여 일부 RDBMS 도구에 의해 수행되어야합니다.
Stamster

6

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

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'

ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다 00942. 00000- "테이블 또는 뷰가 존재하지 않습니다"* 원인 : * 조치 : 라인 오류 : 29 열 : 5 라인 29는 "information_schema.key_column_usage"
noboundaries

2
@noboundaries 당신은 오라클에서 시도하고 있습니다, 질문은 MySQL에 관한 것입니다
ymajoros

1

@ 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을 사용하는 것이 좋습니다.


실제 제약 조건 규칙을 표시하지 않습니다 (예ON UPDATE CASCADE
Stamster

0

오라클이 만든 mysqlshow 도구도 있습니다

--k keys $table_name옵션으로 실행 하면 키가 표시됩니다.

SYNOPSIS
   mysqlshow [options] [db_name [tbl_name [col_name]]]
.......
.......
.......
·   --keys, -k
   Show table indexes.

예:

╰─➤  mysqlshow -h 127.0.0.1 -u root -p --keys database tokens
Database: database  Table: tokens
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field           | Type             | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id              | int(10) unsigned |                    | NO   | PRI |         | auto_increment | select,insert,update,references |         |
| token           | text             | utf8mb4_unicode_ci | NO   |     |         |                | select,insert,update,references |         |
| user_id         | int(10) unsigned |                    | NO   | MUL |         |                | select,insert,update,references |         |
| expires_in      | datetime         |                    | YES  |     |         |                | select,insert,update,references |         |
| created_at      | timestamp        |                    | YES  |     |         |                | select,insert,update,references |         |
| updated_at      | timestamp        |                    | YES  |     |         |                | select,insert,update,references |         |
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name                 | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tokens | 0          | PRIMARY                  | 1            | id          | A         | 2           |          |        |      | BTREE      |         |               |
| tokens | 1          | tokens_user_id_foreign   | 1            | user_id     | A         | 2           |          |        |      | BTREE      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.