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

Effektiv måde at liste udenlandske nøgler til en MySQL-tabel?

SequelPro og Magento bruger begge SHOW CREATE TABLE-forespørgslen til at indlæse de fremmede nøgleoplysninger. Magento's implementering er den, jeg vil referere til, da det både er et PHP-baseret system og et, som vi begge er meget fortrolige med. Imidlertid kan følgende kodestykker anvendes på ethvert PHP-baseret system.

Parsingen udføres i Varien_Db_Adapter_Pdo_Mysql::getForeignKeys() metode (koden for denne klasse kan findes her ) ved hjælp af et relativt simpelt 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-blokken beskriver den det resulterende array som følger:


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

Jeg ved, at det ikke er præcis hvad du bad om, da det bruger outputtet VIS OPRET TABLE, men baseret på mine resultater ser det ud til at det er den almindeligt accepterede måde at gøre tingene på.




  1. Vellykket SQL-injektion trods PHP Magic Quotes

  2. Vagrant port forwarding til Mysql

  3. SQL-forespørgsel for at få kolonneværdier, der svarer til MAX-værdien i en anden kolonne?

  4. Brug af regex med LIKE til at sortere alfabeter først og derefter symboler SQL