Mysql
 sql >> Base de données >  >> RDS >> Mysql

Un moyen performant de répertorier les clés étrangères d'une table MySQL ?

SequelPro et Magento utilisent tous deux la requête SHOW CREATE TABLE pour charger les informations de clé étrangère. L'implémentation de Magento est celle à laquelle je vais faire référence car il s'agit à la fois d'un système basé sur PHP et d'un système que nous connaissons tous les deux très bien. Cependant, les extraits de code suivants peuvent être appliqués à n'importe quel système basé sur PHP.

L'analyse se fait dans le Varien_Db_Adapter_Pdo_Mysql::getForeignKeys() méthode (le code de cette classe peut être trouvé ici ) en utilisant une RegEx relativement simple :


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

Dans le bloc doc, il décrit le tableau résultant comme suit :


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

Je sais que ce n'est pas exactement ce que vous demandiez puisqu'il utilise la sortie SHOW CREATE TABLE, mais d'après mes conclusions, cela semble être la manière généralement acceptée de faire les choses.