sql >> データベース >  >> RDS >> Mysql

MySQLテーブルの外部キーを一覧表示するパフォーマンスの高い方法は?

    SequelProとMagentoはどちらも、SHOWCREATETABLEクエリを使用して外部キー情報をロードします。 Magentoの実装は、PHPベースのシステムであり、私たち二人ともよく知っているものであるため、これから参照するものです。ただし、次のコードスニペットはすべてのPHPベースのシステムに適用できます。

    解析はVarien_Db_Adapter_Pdo_Mysql::getForeignKeys()で行われます。 メソッド(このクラスのコードここで見つけることができます )比較的単純な正規表現を使用する:

    
        $createSql = $this->getCreateTable($tableName, $schemaName);
    
        // collect CONSTRAINT
        $regExp  = '#,\s+CONSTRAINT `([^`]*)` FOREIGN KEY \(`([^`]*)`\) '
            . 'REFERENCES (`[^`]*\.)?`([^`]*)` \(`([^`]*)`\)'
            . '( ON DELETE (RESTRICT|CASCADE|SET NULL|NO ACTION))?'
            . '( ON UPDATE (RESTRICT|CASCADE|SET NULL|NO ACTION))?#';
        $matches = array();
        preg_match_all($regExp, $createSql, $matches, PREG_SET_ORDER);
        foreach ($matches as $match) {
            $ddl[strtoupper($match[1])] = array(
                'FK_NAME'           => $match[1],
                'SCHEMA_NAME'       => $schemaName,
                'TABLE_NAME'        => $tableName,
                'COLUMN_NAME'       => $match[2],
                'REF_SHEMA_NAME'    => isset($match[3]) ? $match[3] : $schemaName,
                'REF_TABLE_NAME'    => $match[4],
                'REF_COLUMN_NAME'   => $match[5],
                'ON_DELETE'         => isset($match[6]) ? $match[7] : '',
                'ON_UPDATE'         => isset($match[8]) ? $match[9] : ''
            );
        }
    
    

    docブロックでは、結果の配列を次のように記述します。

    
        /**
         * The return value is an associative array keyed by the UPPERCASE foreign key,
         * as returned by the RDBMS.
         *
         * The value of each array element is an associative array
         * with the following keys:
         *
         * FK_NAME          => string; original foreign key name
         * SCHEMA_NAME      => string; name of database or schema
         * TABLE_NAME       => string;
         * COLUMN_NAME      => string; column name
         * REF_SCHEMA_NAME  => string; name of reference database or schema
         * REF_TABLE_NAME   => string; reference table name
         * REF_COLUMN_NAME  => string; reference column name
         * ON_DELETE        => string; action type on delete row
         * ON_UPDATE        => string; action type on update row
         */
    
    

    正確にではないことはわかっています SHOW CREATE TABLE出力を使用しているため、あなたが求めていたものですが、私の調査結果に基づくと、これは一般的に受け入れられている方法のようです。




    1. go-sql-driverを使用して新しいMySQLデータベースを作成する方法

    2. データベースの削除は、どのトランザクションでも実行する必要はありませんか?

    3. #1214-使用されるテーブルタイプはFULLTEXTインデックスをサポートしていません

    4. MySQLロードデータファイル-アクセラレーション?