Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách thực hiện để liệt kê các khóa ngoại cho một bảng MySQL?

SequelPro và Magento đều sử dụng truy vấn SHOW CREATE TABLE để tải thông tin khóa ngoại. Cách triển khai của Magento là cách mà tôi sắp tham khảo vì nó vừa là một hệ thống dựa trên PHP vừa là một hệ thống mà cả hai chúng tôi đều rất quen thuộc. Tuy nhiên, các đoạn mã sau có thể được áp dụng cho bất kỳ hệ thống dựa trên PHP nào.

Quá trình phân tích cú pháp được thực hiện trong Varien_Db_Adapter_Pdo_Mysql::getForeignKeys() phương thức ( mã cho lớp này có thể được tìm thấy ở đây ) bằng cách sử dụng RegEx tương đối đơn giản:


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

Trong khối doc, nó mô tả mảng kết quả như sau:


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

Tôi biết nó không chính xác những gì bạn đang yêu cầu vì nó sử dụng đầu ra SHOW CREATE TABLE, nhưng dựa trên những phát hiện của tôi, đó có vẻ là cách làm được chấp nhận chung.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm rõ múi giờ PHP / MySQL

  2. Hộp chọn động MYSQL trong PHP

  3. Làm cách nào để phân trang cho dữ liệu JSON trong PHP?

  4. Trình điều khiển PDO MySQL trên Mac

  5. Cách thêm Ràng buộc NOT NULL trong MySQL