sql >> Databáze >  >> RDS >> Mysql

Výkonný způsob, jak vypsat cizí klíče pro tabulku MySQL?

SequelPro i Magento využívají dotaz SHOW CREATE TABLE k načtení informací o cizím klíči. Implementace Magenta je ta, na kterou se budu odkazovat, protože je to systém založený na PHP a systém, který oba velmi dobře známe. Následující fragmenty kódu však lze použít na jakýkoli systém založený na PHP.

Analýza se provádí v Varien_Db_Adapter_Pdo_Mysql::getForeignKeys() metoda (kód pro tuto třídu naleznete zde ) pomocí relativně jednoduchého 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] : ''
        );
    }

V bloku doc ​​popisuje výsledné pole takto:


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

Vím, že to není přesně to, co jste požadovali, protože používá výstup SHOW CREATE TABLE, ale na základě mých zjištění se zdá, že je to obecně přijímaný způsob, jak věci dělat.




  1. Proč tento spouštěč MySQL způsobuje přetečení zásobníku?

  2. Kompromisy v Hot Standby Deployments

  3. SQL Nahraďte poslední 2 znaky, pokud se poslední 2 znaky shodují

  4. Jak vyřešit problém Nelze načíst ověřovací plugin 'caching_sha2_password'