Mysql
 sql >> база данни >  >> RDS >> Mysql

Ефективен начин за изброяване на чужди ключове за MySQL таблица?

SequelPro и Magento използват заявката SHOW CREATE TABLE за зареждане на информацията за външния ключ. Имплементацията на Magento е тази, на която ще се позова, тъй като тя е едновременно базирана на PHP система и система, с която и двамата сме много запознати. Въпреки това, следните кодови фрагменти могат да бъдат приложени към всяка PHP базирана система.

Разборът се извършва в Varien_Db_Adapter_Pdo_Mysql::getForeignKeys() метод (кодът за този клас можете да намерите тук ) с помощта на сравнително прост 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] : ''
        );
    }

В блока doc той описва получения масив, както следва:


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

Знам, че не е точно това, което искахте, тъй като използва изхода SHOW CREATE TABLE, но въз основа на моите констатации изглежда, че това е общоприетият начин за правене на нещата.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Нормализирането затруднява свързванията в множество таблици

  2. Алтернатива за ограничение на MySQL CHECK

  3. MySQL заявка, MAX() + GROUP BY

  4. Актуализирайте MySql таблицата от CSV с помощта на PHP

  5. Как да се свържете с mysql от C# през SSH