Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Performanter Weg zum Auflisten von Fremdschlüsseln für eine MySQL-Tabelle?

SequelPro und Magento verwenden beide die Abfrage SHOW CREATE TABLE, um die Fremdschlüsselinformationen zu laden. Ich werde auf die Magento-Implementierung verweisen, da es sowohl ein PHP-basiertes System ist als auch eines, mit dem wir beide sehr vertraut sind. Die folgenden Codeausschnitte können jedoch auf jedes PHP-basierte System angewendet werden.

Das Parsing erfolgt im Varien_Db_Adapter_Pdo_Mysql::getForeignKeys() Methode (der Code für diese Klasse finden Sie hier ) mit einem relativ einfachen RegEx:


    $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] : ''
        );
    }

Im Doc-Block wird das resultierende Array wie folgt beschrieben:


    /**
     * 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
     */

Ich weiß, es ist nicht genau wonach Sie gefragt haben, da es die Ausgabe von SHOW CREATE TABLE verwendet, aber nach meinen Erkenntnissen scheint dies die allgemein akzeptierte Vorgehensweise zu sein.