Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wydajny sposób na wyświetlenie kluczy obcych dla tabeli MySQL?

SequelPro i Magento wykorzystują zapytanie SHOW CREATE TABLE do załadowania informacji o kluczu obcym. Implementacja Magento jest tą, do której będę się odnosił, ponieważ jest to zarówno system oparty na PHP, jak i taki, który oboje dobrze znamy. Jednak poniższe fragmenty kodu można zastosować do dowolnego systemu opartego na PHP.

Parsowanie odbywa się w Varien_Db_Adapter_Pdo_Mysql::getForeignKeys() metoda (kod dla tej klasy można znaleźć tutaj ) przy użyciu stosunkowo prostego wyrażenia regularnego:


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

W bloku doc ​​opisuje wynikową tablicę w następujący sposób:


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

Wiem, że to nie dokładnie to, o co prosiłeś, ponieważ używa danych wyjściowych SHOW CREATE TABLE, ale na podstawie moich ustaleń wydaje się, że jest to ogólnie akceptowany sposób robienia rzeczy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Złożoność:SELECT COUNT(*) FROM MyTable;

  2. Połącz grupuj według i policz mysql

  3. Jak przechowywać nazwę pliku w bazie danych wraz z innymi informacjami podczas przesyłania obrazu na serwer za pomocą PHP?

  4. MySQL miesięczna Wyprzedaż z ostatnich 12 miesięcy, w tym miesiące bez wyprzedaży

  5. Czy istnieje sposób na wycofanie po zatwierdzeniu w MySQL?