테이블 또는 열에 대한 모든 외래 키를 보려면 어떻게합니까?


답변:


764

테이블의 경우 :

SELECT 
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '<database>' AND
  REFERENCED_TABLE_NAME = '<table>';

열의 경우 :

SELECT 
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '<database>' AND
  REFERENCED_TABLE_NAME = '<table>' AND
  REFERENCED_COLUMN_NAME = '<column>';

기본적으로 where 절에서 REFERENCED_TABLE_NAME을 REFERENCED_COLUMN_NAME으로 변경했습니다.


26
이것은 항상 나에게 빈 세트를 제공하지만 아래 노드에서 제안한 쿼리는 정상적으로 작동합니다.
Acute

7
@Acute : 정확한 테이블에 대해 묻는 것이 확실합니까? 노드의 쿼리가 작동하면 다른 방향 (예 : 키 TO mytable이 아닌 키 FROM mytable)에 대해 묻는 것 같습니다. 이는 테이블 이름과 '<'및 '>'없이 '<table>'을 썼을 것으로 예상합니다. ?
Vinko Vrsalovic

3
<table> : FROM을 참조하는 키를 쿼리했기 때문에 쿼리를 잘못 이해 한 것 같습니다 (예 : "<table>"XD 대신 테이블 이름을 썼습니다)
Acute

4
테이블 이름이 고유하지 않다면 쿼리를 특정 데이터베이스로 제한 할 수도 있습니다. where 절을 다음과 같이 변경하십시오.where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
user12345

사용자가 데이터베이스에 대한 모든 권한을 가지고 있지만 루트 사용자가 아닌 경우에는 작동하지 않습니다.
Deepak Ram

275

편집 : 의견에서 지적했듯이 이것은 OP 질문에 대한 정답은 아니지만이 명령을 아는 것이 유용합니다. 이 질문은 내가 찾던 것에 대해 Google에 나타 났으며 다른 사람들이 찾을 수 있도록이 답변을 남길 것이라고 생각했습니다.

SHOW CREATE TABLE `<yourtable>`;

이 답변을 여기에서 찾았습니다 : MySQL : 테이블에 대한 제약 조건 표시 명령

FK의 존재 유무를 확인하는 것이 아니라 FK가 어떻게 작동하는지 확인하고 싶기 때문에이 방법이 필요했습니다.


37
이 쇼의 모든 제약 조건 <yourtable>, 그 시점에 모든 제약 <yourtable>.
Barmar

18
@Barmar가 말했듯이 이것은 완전히 잘못되었습니다. 그것은 지정된 테이블에 속하는 외래 키를 표시되지만 가리키는 외래 키 표시되지 않습니다 에게 질문을 요청 무엇 테이블을. 이것이 어떻게 50 개의 공감대를 얻었는지 전혀 모른다. 나는 사람들이 실제로 반대 질문에 대한 답을 찾고 있었을 때 어쨌든 그들의 대답을 찾았으며, 투표하기 전에 원래 질문 (또는 제목)을 읽는 것을 귀찮게하지 않았을 때 사람들이 여기에서 끝난 것 같아요.
Mark Amery

2
@MarkAmery : 이것은 display foreign keys mysql구글 의 첫 결과이며 , 그 이유 일 수 있습니다;)
Jigar

1
thisi는 실제로 존재하는 모든 제약 조건을 보여줍니다. phpmyadmin은 테이블을 가리키는 제약 조건 만 보여줍니다. ORM 도구를 피하기 중복에 충분한 것 같다
william.eyidi

3
이것이 내가 찾던 것이므로 OP의 질문에 대답하지 않았더라도 게시 해 주셔서 감사합니다. 관계에서 양방향으로 보는 방법을 아는 것은 결코 아프지 않습니다!
Charles Wood

75

InnoDB와 정의 된 FK를 사용하는 경우 information_schema 데이터베이스를 쿼리 할 수 ​​있습니다.

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';

15
실제로, 그것은 잘못된 방향을 가리 킵니다. 이 쿼리는 'mytable'을 가리키는 모든 외래 키가 아니라 FROM 'mytable'을 가리키는 모든 외래 키를 보여줍니다.
Christian Oudard

1
이것은 내 경우에 더 잘 작동합니다. InnoDB 엔진 MyISAM 또는 NDB를 변경할 수 있으려면 테이블에서 모든 외래 키 제약 조건 (및 그 외의 제약 조건) 만 삭제해야합니다.
Kohányi Róbert

REFERENTIAL_CONSTRAINTS 테이블에서 외래 키를 양방향으로 얻을 수 있습니다. 쿼리에 다른 답변을 추가했습니다.
ChrisV

45

유용한 정보를 추가하기 위해 이전 답변에 게시.

비슷한 문제가 있었지만 REFERENCED 테이블 및 열 이름과 함께 CONSTRAINT_TYPE을보고 싶었습니다. 그래서,

  1. 테이블의 모든 FK를 보려면

    USE '<yourschema>';
    
    SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
    FROM information_schema.TABLE_CONSTRAINTS i 
    LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
    WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND i.TABLE_SCHEMA = DATABASE()
    AND i.TABLE_NAME = '<yourtable>';
  2. 스키마의 모든 테이블과 FK를 보려면

    USE '<yourschema>';
    
    SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
    FROM information_schema.TABLE_CONSTRAINTS i 
    LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
    WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND i.TABLE_SCHEMA = DATABASE();
  3. 데이터베이스의 모든 FK를 보려면

    SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
    FROM information_schema.TABLE_CONSTRAINTS i 
    LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
    WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';

생각해 내다!

이것은 InnoDB 스토리지 엔진을 사용하고 있습니다. 외래 키를 추가 한 후에 표시 할 수없는 경우 테이블이 MyISAM을 사용하고 있기 때문일 수 있습니다.

확인하다:

SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';

수정하려면 다음을 사용하십시오.

ALTER TABLE `<yourtable>` ENGINE=InnoDB;

8
여기에 설명 된대로 그 쿼리는 WHERE 절에 '<표>'훨씬 더 빨리 (2 초에서 0.0015 초에) 당신이 k.TABLE_SCHEMA = DATABASE ()와 k.TABLE_NAME =를 지정하면 실행 dev.mysql.com/doc/refman /5.5/ko/…
guigouz

2
좋은 대답입니다. MyISAM에 대한 솔루션이 있습니까?
Beau Bouchard

2
MyISAM은 불행히도 외래 키를 지원하지 않습니다. dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html
Andy

24

Node의 답변에 대한 대안으로 InnoDB 및 정의 된 FK를 사용하는 경우 information_schema 데이터베이스를 쿼리 할 수 ​​있습니다.

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'

<table>의 외래 키 또는

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'

<table>에 대한 외래 키

원하는 경우 UPDATE_RULE 및 DELETE_RULE을 얻을 수도 있습니다.


2
REFERENTIAL_CONSTRAINTS 테이블을 사용하면 업데이트 및 계단식 규칙을 제공하므로 개인적 으로이 대답을 선호합니다. +1
Luke Madhanga

테이블에 대해 발견하면 외래 키를 두 가지 방법으로 설정할 수 있습니다.
Encoder

11

이 솔루션은 모든 관계뿐만 아니라 제약 조건 이름도 표시 할 수 있습니다.

select
    concat(table_name, '.', column_name) as 'foreign key',
    concat(referenced_table_name, '.', referenced_column_name) as 'references',
    constraint_name as 'constraint name'
from
    information_schema.key_column_usage
where
    referenced_table_name is not null;

특정 데이터베이스에서 테이블을 확인하려면 쿼리 끝에 스키마 이름을 추가하십시오.

select
    concat(table_name, '.', column_name) as 'foreign key',
    concat(referenced_table_name, '.', referenced_column_name) as 'references',
    constraint_name as 'constraint name'
from
    information_schema.key_column_usage
where
    referenced_table_name is not null
    and table_schema = 'database_name';

마찬가지로 특정 열 이름에 대해

그리고 table_name = 'table_name

쿼리가 끝날 때

이 게시물 에서 영감을 얻었습니다 .


7

REFERENCED_TABLE_NAME을 사용하는 것이 항상 작동하는 것은 아니며 NULL 값일 수 있습니다. 대신 다음 쿼리를 사용할 수 있습니다.

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';

4

다음을 사용하여 FK를 나열하는 빠른 방법 (외국 키 참조)

KEY_COLUMN_USAGE view:

SELECT CONCAT( table_name, '.',
column_name, ' -> ',
referenced_table_name, '.',
referenced_column_name ) AS list_of_fks
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;

이 쿼리는 제약 조건과 모든 참조 및 참조 테이블이 동일한 스키마에 있다고 가정합니다.

자신의 의견을 추가하십시오.

출처 : 공식 mysql 매뉴얼.


3

내가 생각 해낸 해결책은 깨지기 쉽다. 외부 키에 대한 django의 명명 규칙에 의존합니다.

USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee

그런 다음 껍질에서

grep 'refs_tablename_id' mysql_output

2

다음 과 같은 특정 외래 키를 포함하는 모든 테이블을 찾으려면employee_id

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';

2

외래 키 열의 이름을 얻으려면 다음을 수행하십시오.

SELECT i.TABLE_SCHEMA, i.TABLE_NAME, 
       i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, 
       k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME 
  FROM information_schema.TABLE_CONSTRAINTS i 
  LEFT JOIN information_schema.KEY_COLUMN_USAGE k 
       ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
 WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY' 
 ORDER BY i.TABLE_NAME;

고마워 훌륭한 솔루션! 'k.COLUMN_NAME'을 추가하기 위해 열 이름도 필요했습니다.
Andreas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.