Mysql
 sql >> Database >  >> RDS >> Mysql

Modo efficiente per elencare le chiavi esterne per una tabella MySQL?

SequelPro e Magento utilizzano entrambi la query SHOW CREATE TABLE per caricare le informazioni sulla chiave esterna. L'implementazione di Magento è quella a cui farò riferimento poiché è sia un sistema basato su PHP che uno con cui entrambi abbiamo molta familiarità. Tuttavia, i seguenti frammenti di codice possono essere applicati a qualsiasi sistema basato su PHP.

L'analisi viene eseguita in Varien_Db_Adapter_Pdo_Mysql::getForeignKeys() metodo (il codice per questa classe può essere trovato qui ) utilizzando una RegEx relativamente semplice:


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

Nel blocco doc descrive l'array risultante come segue:


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

So che non è esattamente quello che stavi chiedendo poiché utilizza l'output SHOW CREATE TABLE, ma in base ai miei risultati, sembra essere il modo generalmente accettato di fare le cose.