2011-01-20 6 views
3

MySQL 데이터베이스의 특정 InnoDB 테이블에서 외래 키를 프로그래밍 방식으로 찾고 싶습니다.Perl/DBI/MySQL/InnoDB를 사용하여 외래 키 정보 찾기

저는 Perl을 사용하고 있는데, 나는 $dbh->foreign_key_info을 우연히 발견했습니다. 나는 그것을 사용하려고 시도했지만 약간 결함이있는 것 같다.

ON DELETE 및 ON UPDATE 정보를 반환 할 수는 없지만 반환 할 수는 없습니다. 또한 정기적 인 색인을 반환합니다.

도움 주셔서 감사합니다.

use strict; 
use warnings; 
use DBI; 
use Data::Dumper; 
my $dbh = DBI->connect("DBI:mysql:database=db;host=localhost", "user", "password"); 
my $sth = $dbh->foreign_key_info(undef, undef, undef, undef, undef, "table_name"); 
print Dumper $sth->fetchall_hashref("FK_NAME"); 

그리고 출력은 : 아직 MySQL의 드라이버에서 지원되지 않을 수 있습니다처럼

$VAR1 = { 
     'some_table_ibfk_3' => { 
            'PK_NAME' => undef, 
            'DEFERABILITY' => undef, 
            'FKTABLE_CAT' => undef, 
            'PKTABLE_SCHEM' => 'db', 
            'UNIQUE_OR_PRIMARY' => undef, 
            'PKTABLE_CAT' => undef, 
            'FKTABLE_NAME' => 'some_table', 
            'FKTABLE_SCHEM' => 'db', 
            'PKTABLE_NAME' => 'some_other_table', 
            'FKCOLUMN_NAME' => 'some_other_table_id', 
            'FK_NAME' => 'some_table_ibfk_3', 
            'DELETE_RULE' => undef, 
            'PKCOLUMN_NAME' => 'id', 
            'KEY_SEQ' => '1', 
            'UPDATE_RULE' => undef 
            }, 
     'user_id_2' => { 
         'PK_NAME' => undef, 
         'DEFERABILITY' => undef, 
         'FKTABLE_CAT' => undef, 
         'PKTABLE_SCHEM' => undef, 
         'UNIQUE_OR_PRIMARY' => undef, 
         'PKTABLE_CAT' => undef, 
         'FKTABLE_NAME' => 'some_table', 
         'FKTABLE_SCHEM' => 'db', 
         'PKTABLE_NAME' => undef, 
         'FKCOLUMN_NAME' => 'some_other_table_id', 
         'FK_NAME' => 'user_id_2', 
         'DELETE_RULE' => undef, 
         'PKCOLUMN_NAME' => undef, 
         'KEY_SEQ' => '2', 
         'UPDATE_RULE' => undef 
        }, 
     'PRIMARY' => { 
        'PK_NAME' => undef, 
        'DEFERABILITY' => undef, 
        'FKTABLE_CAT' => undef, 
        'PKTABLE_SCHEM' => undef, 
        'UNIQUE_OR_PRIMARY' => undef, 
        'PKTABLE_CAT' => undef, 
        'FKTABLE_NAME' => 'some_table', 
        'FKTABLE_SCHEM' => 'db', 
        'PKTABLE_NAME' => undef, 
        'FKCOLUMN_NAME' => 'id', 
        'FK_NAME' => 'PRIMARY', 
        'DELETE_RULE' => undef, 
        'PKCOLUMN_NAME' => undef, 
        'KEY_SEQ' => '1', 
        'UPDATE_RULE' => undef 
        }, 
     'some_table_ibfk_1' => { 
            'PK_NAME' => undef, 
            'DEFERABILITY' => undef, 
            'FKTABLE_CAT' => undef, 
            'PKTABLE_SCHEM' => 'db', 
            'UNIQUE_OR_PRIMARY' => undef, 
            'PKTABLE_CAT' => undef, 
            'FKTABLE_NAME' => 'some_table', 
            'FKTABLE_SCHEM' => 'db', 
            'PKTABLE_NAME' => 'user_bk2', 
            'FKCOLUMN_NAME' => 'user_id', 
            'FK_NAME' => 'some_table_ibfk_1', 
            'DELETE_RULE' => undef, 
            'PKCOLUMN_NAME' => 'id', 
            'KEY_SEQ' => '1', 
            'UPDATE_RULE' => undef 
            }, 
     'some_table_ibfk_2' => { 
            'PK_NAME' => undef, 
            'DEFERABILITY' => undef, 
            'FKTABLE_CAT' => undef, 
            'PKTABLE_SCHEM' => 'db', 
            'UNIQUE_OR_PRIMARY' => undef, 
            'PKTABLE_CAT' => undef, 
            'FKTABLE_NAME' => 'some_table', 
            'FKTABLE_SCHEM' => 'db', 
            'PKTABLE_NAME' => 'user_bk2', 
            'FKCOLUMN_NAME' => 'coach_id', 
            'FK_NAME' => 'some_table_ibfk_2', 
            'DELETE_RULE' => undef, 
            'PKCOLUMN_NAME' => 'id', 
            'KEY_SEQ' => '1', 
            'UPDATE_RULE' => undef 
            } 
    }; 

답변

1

것 같습니다. 디버그를 통해 빠른 검사를하고, 다음과 같은 SQL 문을 입력됩니다처럼 보이는 다음 UPDATE_RULE 및 DELETE_RULE 열이 모두 NULL로 설정되어

SELECT NULL AS PKTABLE_CAT, 
    A.REFERENCED_TABLE_SCHEMA AS PKTABLE_SCHEM, 
    A.REFERENCED_TABLE_NAME AS PKTABLE_NAME, 
    A.REFERENCED_COLUMN_NAME AS PKCOLUMN_NAME, 
    A.TABLE_CATALOG AS FKTABLE_CAT, 
    A.TABLE_SCHEMA AS FKTABLE_SCHEM, 
    A.TABLE_NAME AS FKTABLE_NAME, 
    A.COLUMN_NAME AS FKCOLUMN_NAME, 
    A.ORDINAL_POSITION AS KEY_SEQ, 
    NULL AS UPDATE_RULE, 
    NULL AS DELETE_RULE, 
    A.CONSTRAINT_NAME AS FK_NAME, 
    NULL AS PK_NAME, 
    NULL AS DEFERABILITY, 
    NULL AS UNIQUE_OR_PRIMARY 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE A, 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS B 
WHERE A.TABLE_SCHEMA = B.TABLE_SCHEMA AND A.TABLE_NAME = B.TABLE_NAME 
    AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME AND B.CONSTRAINT_TYPE IS NOT NULL 
    AND A.TABLE_NAME = ? ORDER BY A.TABLE_SCHEMA, A.TABLE_NAME, A.ORDINAL_POSITION 

공지있다.

+0

감사합니다. Joel. 부끄러운 일은 아직 완전히 구현되지 않았습니다. 여기 regexes가 ... – aidan