sql >> Databasteknik >  >> RDS >> Mysql

Presterande sätt att lista främmande nycklar för en MySQL-tabell?

SequelPro och Magento använder båda SHOW CREATE TABLE-frågan för att ladda den främmande nyckelinformationen. Magentos implementering är den jag kommer att referera till eftersom det både är ett PHP-baserat system och ett som vi båda är mycket bekanta med. Följande kodavsnitt kan dock tillämpas på alla PHP-baserade system.

Analysen görs i Varien_Db_Adapter_Pdo_Mysql::getForeignKeys() metod (koden för denna klass finns här ) med ett relativt enkelt 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] : ''
        );
    }

I doc-blocket beskriver den den resulterande arrayen enligt följande:


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

Jag vet att det inte är exakt det du frågade efter eftersom det använder SHOW CREATE TABLE-utgången, men baserat på mina upptäckter verkar det vara det allmänt accepterade sättet att göra saker på.




  1. Hur man låser en enda rad

  2. Varför denna viloläge mall bulkUpdate inte fungerar

  3. Hur tar man bort tidsdelen av ett datetime-värde (SQL-server)?

  4. Java MYSQL/JDBC-frågan returnerar inaktuella data från cachad anslutning