테이블 또는 열에 대한 모든 외래 키를 보려면 어떻게합니까?
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을보고 싶었습니다. 그래서,
테이블의 모든 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>';
스키마의 모든 테이블과 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();
데이터베이스의 모든 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
'Programming' 카테고리의 다른 글
들여 쓰기 오류 : 들여 쓰기가 외부 들여 쓰기 레벨과 일치하지 않습니다 (0) | 2020.02.11 |
---|---|
bash 스크립트에서 숫자를 추가하는 방법 (0) | 2020.02.11 |
명령문의 "INSERT INTO dbo.Blah"부분을 반복하지 않고 여러 행을 삽입하려면 어떻게합니까? (0) | 2020.02.11 |
VirtualBox vmdk 파일의 크기를 조정하는 방법 (0) | 2020.02.11 |
특정 배열 인덱스에 값이 있는지 JavaScript를 어떻게 확인합니까? (0) | 2020.02.11 |