특정 table.column을 참조하는 외래 키가 있고 해당 외래 키에 대한 값이있는 모든 테이블을 찾는 방법은 무엇입니까?


272

기본 키가 다른 여러 테이블에서 외래 키로 참조되는 테이블이 있습니다. 예를 들면 다음과 같습니다.

  CREATE TABLE `X` (
    `X_id` int NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY  (`X_id`)
  )
  CREATE TABLE `Y` (
    `Y_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Y_id`),
    CONSTRAINT `Y_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )
  CREATE TABLE `Z` (
    `Z_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Z_id`),
    CONSTRAINT `Z_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )

이제 테이블 Y 및 Z와 같이 X에 외래 키를 포함하는 데이터베이스에 테이블이 몇 개 있는지 알 수 없습니다. 반환하는 데 사용할 수있는 SQL 쿼리가 있습니까?

  1. X에 외래 키가있는 테이블 목록
  2. 그리고 그 테이블 중 어느 것이 실제로 외래 키에 값을 가지고 있는지

답변:


384

여기 있습니다 :

USE information_schema;
SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id';

비슷한 테이블 / 열 이름을 가진 여러 데이터베이스가있는 경우 특정 데이터베이스로 쿼리를 제한 할 수도 있습니다.

SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id'
  AND TABLE_SCHEMA = 'your_database_name';

7
SELECT TABLE_NAME보다 SELECT *
zloctb

어떤 종류의 DB에 유용합니까? MySql?
Cirelli94

2
@ Cirelli94이 질문은 MySQL 질문으로 태그되었습니다.
mikeschuld 님

61

MySQL 5.5 레퍼런스 매뉴얼 : "InnoDB 및 FOREIGN KEY 제약 조건"

SELECT
  ke.REFERENCED_TABLE_SCHEMA parentSchema,
  ke.referenced_table_name parentTable,
  ke.REFERENCED_COLUMN_NAME parentColumnName,
  ke.TABLE_SCHEMA ChildSchema,
  ke.table_name childTable,
  ke.COLUMN_NAME ChildColumnName
FROM
  information_schema.KEY_COLUMN_USAGE ke
WHERE
  ke.referenced_table_name IS NOT NULL
  AND ke.REFERENCED_COLUMN_NAME = 'ci_id' ## Find Foreign Keys linked to this Primary Key
ORDER BY
  ke.referenced_table_name;

21

이 솔루션은 모든 관계뿐만 아니라 제약 조건 이름도 표시 할 수 있으며, 일부 경우에 필요합니다 (예 : 드롭 제약 조건).

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

15

현명하게 명명 된 information_schema테이블 에서 모든 스키마 관련 정보를 찾을 수 있습니다 .

테이블을 확인하고 싶을 수도 있습니다 REFERENTIAL_CONSTRAINTSKEY_COLUMN_USAGE. 전자는 어떤 테이블이 다른 테이블에 의해 참조되는지 알려줍니다. 후자는 필드가 어떻게 관련되어 있는지 알려줍니다.


5

설명을 포함하여 DB의 모든 외래 키 나열

    SELECT  
    i1.CONSTRAINT_NAME, i1.TABLE_NAME,i1.COLUMN_NAME,
    i1.REFERENCED_TABLE_SCHEMA,i1.REFERENCED_TABLE_NAME, i1.REFERENCED_COLUMN_NAME,
    i2.UPDATE_RULE, i2.DELETE_RULE 
    FROM   
    information_schema.KEY_COLUMN_USAGE AS i1  
    INNER JOIN 
    information_schema.REFERENTIAL_CONSTRAINTS AS i2 
    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
    WHERE i1.REFERENCED_TABLE_NAME IS NOT NULL  
    AND  i1.TABLE_SCHEMA  ='db_name';

테이블 테이블의 특정 열로 제한

AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name'

3

나는 작은 bash를 온라인으로 썼다. 친숙한 결과를 얻기 위해 스크립트에 쓸 수 를 .

mysql_references_to :

mysql -uUSER -pPASS -A DB_NAME -se "USE information_schema; SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = '$1' AND REFERENCED_COLUMN_NAME = 'id'\G" | sed 's/^[ \t]*//;s/[ \t]*$//' |egrep "\<TABLE_NAME|\<COLUMN_NAME" |sed 's/TABLE_NAME: /./g' |sed 's/COLUMN_NAME: //g' | paste -sd "," -| tr '.' '\n' |sed 's/,$//' |sed 's/,/./'

따라서 실행 : mysql_references_to transaccion( transaccion 은 임의의 테이블 이름입니다) 출력은 다음과 같습니다.

carrito_transaccion.transaccion_id
comanda_detalle.transaccion_id
comanda_detalle_devolucion.transaccion_positiva_id
comanda_detalle_devolucion.transaccion_negativa_id
comanda_transaccion.transaccion_id
cuenta_operacion.transaccion_id
...

-4

가장 쉬운 방법 :
1. phpMyAdmin을 엽니 다
. 2. 왼쪽 클릭 데이터베이스 이름
3. 오른쪽 상단에서 "디자이너"탭을 찾습니다.

모든 제약 조건이 여기에 표시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.