Programming

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

procodes 2020. 2. 11. 22:43
반응형

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


MySQL에서 특정 테이블을 가리키는 모든 외래 키 제약 조건의 목록을 어떻게 얻습니까? 특정 열? 이것은 이 오라클 질문 과 동일 하지만 MySQL의 경우입니다.


테이블의 경우 :

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으로 변경했습니다.


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

SHOW CREATE TABLE `<yourtable>`;

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

FK의 존재 유무를 보지 않고 FK의 기능을보고 싶었 기 때문에이 방법이 필요했습니다.


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';

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

비슷한 문제가 있었지만 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;

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을 얻을 수도 있습니다.


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

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

쿼리가 끝날 때

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


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

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

을 사용하여 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 매뉴얼.


내가 생각 해낸 해결책은 깨지기 쉽다. 외부 키에 대한 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

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

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

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

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;

참고 URL : https://stackoverflow.com/questions/201621/how-do-i-see-all-foreign-keys-to-a-table-or-column



반응형