列出 MySQL 表外键的高效方法?

2024-01-07

有没有表演者如何获取分配给 MySQL 表的外键列表?

查询信息模式

SELECT
    `column_name`, 
    `referenced_table_schema` AS foreign_db, 
    `referenced_table_name` AS foreign_table, 
    `referenced_column_name`  AS foreign_column 
FROM
    `information_schema`.`KEY_COLUMN_USAGE`
WHERE
    `constraint_schema` = SCHEMA()
AND
    `table_name` = 'your-table-name-here'
AND
    `referenced_column_name` IS NOT NULL
ORDER BY
    `column_name`;

可以工作,但是在我尝试过的 MySQL 版本上速度慢得令人痛苦。一些研究出现了this bug http://bugs.mysql.com/bug.php?id=19588,这似乎表明这是一个持续存在的问题,没有明确的解决方案。暗示的解决方案需要使用补丁重新配置或重新编译 mysql,这不适用于我正在从事的项目。

我意识到可以发出以下内容

SHOW CREATE TABLE table_name;

并获取 CREATE TABLE 语句的字符串表示形式,其中将包含外键约束。然而,解析这个字符串似乎很脆弱,而且我没有大量的 CREATE TABLE 语句来测试。 (如果有一个标准的解析代码,我希望有一些链接)

我还意识到我可以用以下内容列出索引

SHOW CREATE TABLE table_name;

索引列表将包括外键,但似乎没有办法确定哪些索引是外键,哪些是“常规”MySQL 索引。同样,与 SHOW CREATE 表信息的一些交叉引用可能会有所帮助,但这让我们回到了脆弱的字符串解析。

任何帮助,甚至是有关该问题的其他明智讨论的链接,将不胜感激。


SequelPro 和 Magento 都使用 SHOW CREATE TABLE 查询来加载外键信息。 Magento 的实现是我要参考的,因为它既是一个基于 PHP 的系统,也是我们都非常熟悉的系统。但是,以下代码片段可以应用于任何基于 PHP 的系统。

解析是在Varien_Db_Adapter_Pdo_Mysql::getForeignKeys()方法 (这个类的代码可以在这里找到 http://svn.magentocommerce.com/source/branches/1.6/lib/Varien/Db/Adapter/Pdo/Mysql.php)使用相对简单的正则表达式:


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

在文档块中,它描述了结果数组,如下所示:


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

我知道这不是exactly您所要求的,因为它使用 SHOW CREATE TABLE 输出,但根据我的发现,这似乎是普遍接受的做事方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

列出 MySQL 表外键的高效方法? 的相关文章

  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • 在 MySQL 中对整数字段运行带引号的数字(字符串)查询时会发生哪些复杂情况

    在 SQL 中 不应引用整数 因为如果引用 它将是一个字符串 但我很好奇如果我这样做会出现什么问题 并发症 例如 SELECT FROM table WHERE id 1 正确的 vs SELECT FROM table WHERE id
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • 优化我的表现

    我正在开发一个使用 Zend Framework 1 11 Doctrine 2 一些 Symfony 2 组件以及其他工具和库的项目 我正在尝试使用 Xdebug 和 Webgrind 优化性能 我已经发现了一些瓶颈 例如解析 Ini 配
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • mysql转储到derby

    我正在使用 derby 在 eclipse 中进行开发 是否可以从 MySQL 转储表并以某种方式将其用于 derby 我知道 ddl 和 dml 对于两个 dbms 来说是不同的 但我正在寻找一种除了转储 导出之外的合适方法 我可以找到两
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • MySQL 错误 1172 - 结果包含多行

    在存储过程中运行查询时 我从 MySQL 收到此错误 错误代码 1172 结果包含多行 我理解错误 我正在做一个SELECT INTO var list 因此查询需要返回单行 当我使用LIMIT 1 or SELECT DISTINCT 错
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 在 jQuery AJAX 成功中从 MySql 获取特定响应

    好吧 我有这个 ajax 代码 它将在 Success 块中返回 MySql 的结果 ajax type POST url index php success function data alert data My Query sql SE
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同

随机推荐

  • 如何在 JavaScript 中加载文本文件?

    我正在创建一个简单的 WebGL 项目 需要一种加载模型的方法 我决定使用 OBJ 格式 所以我需要一种方法来加载它 该文件 将 存储在服务器上 我的问题是 JS 中的文件如何加载到文本文件中并逐行扫描它 逐个令牌 就像 C 中的流一样 我
  • OpenGL ES 顶点着色器中动态调整大小的数组;用于混合形状/变形目标

    我即将执行混合形状 变形目标的 Opengl ES 实现 但我不太确定执行此操作的最佳方法 我面临的问题是我希望顶点数据的插值发生在 GPU 上 但我也希望混合形状的数量是任意的 澄清一下 我不希望我的顶点着色器看起来像这样 OpenGL
  • Wpf 动画最佳实践 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • async/await 函数内的 JavaScript Promise 解析最终的响应数组

    我是 JavaScript 和 Promises 方面的新手 我正在尝试构建从 API 获得的对象数组 为此 我在一个文件中构建了两个函数MyFile js 当 axios Promise 得到解决时 第一个返回一个 Promise 它是
  • 单击 ActionBar 中的后退按钮时不会调用 onActivityResult

    这是我的问题 创建一个主活动 添加一个按钮来启动另一个活动 SecondActivity Intent i new Intent getActivity SecondActivity class startActivityForResult
  • 使用 Java 进行 PGP 加密和解密 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想使用 PGP 密钥解密文件 我已经下载并安装了 PGP 密钥安装程序 我使用它创建了一个文本文件并使用 PGP 密钥加密了该文本文
  • 用于索引的 Cloud Firestore 通配符

    设置索引时 Cloud Firestore 中通配符级别的语法是什么 我知道有一个安全规则 Thanks Cloud Firestore 索引基于集合名称 不是完整的收集路径 所以如果你想创建索引users id messages 正确的方
  • 依赖注入 - 多个类方法中需要新实例

    我有一些代码看起来像这样 public MyService IDependency dependency dependency dependency public Message Method1 dependency DoSomething
  • 使用 Unix 工具和多列进行排序

    我正在寻找解决这个问题的最简单的方法 我有一个巨大的数据集 无法加载到这种格式的 Excel 中 This is a sentence 10 This is another sentence 5 This is the last sente
  • Delphi #IF(DEBUG) 等效吗?

    Delphi 是否有与 C if DEBUG 编译器指令等效的代码 用这个 IFDEF DEBUG ENDIF
  • 如何使用 imageio 调整图像大小?

    考虑一个图像img类型的imageio core util Array 形状为img is 256 256 3 我想将其调整为 128 128 3 我至少尝试了以下三种 img resize img res pilmode RGB img
  • 从 MySQL 表生成报告

    假设您有一堆 MySQL 表 并且您希望最终用户能够使用 PHP 脚本使用这些数据生成报告 您可以在下拉列表中显示这些表中的字段名称 因此用户可能会说 first name等于约翰 很好 但是 如果您希望这些字段名称更具可读性怎么办 例如
  • moment.js isValid 函数无法正常工作

    我有这个问题 我没有找到任何类似的东西 而且似乎很奇怪没有人在使用 moment js 验证时间时遇到这个问题 moment 03 55 HH mm isValid true moment 03 55jojojo HH mm isValid
  • 检查数组中每个文本框的标签

    如何检查数组中所有 TextBox 控件的 Tag 属性 我想要这样的东西 If textBox Tag And textbox2 Tag And textbox21 Tag And textbox22 Tag And textbox23
  • CSS“snap-scroll”干扰 jQuery“.animatescrollLeft”

    我有一个 html 和 css 滑块 我正在使用scroll snap用于手动滚动和用于自动滚动的 jQuery 按钮 然而 当使用scroll snap type x mandatory jQueryscrollLeft动画变得极其滞后或
  • AngularJS 数据绑定不起作用 - 在控制器范围内变量未显示输入的值

    我有一个奇怪的情况 scope变量绑定似乎没有按预期工作 这是 HTML div class input group style width 100px div
  • 初始化哈希值

    我经常写这样的东西 a hash x a hash x some more text a hash x first text 应该有更好的方法来做到这一点 但我找不到 有两种方法可以为 a 创建初始值Hash 一种是将单个对象传递给Hash
  • 相当于 ftp put 并追加到 scp 中

    我有一个我无法理解的遗留脚本 该脚本是将unix中的4个文件 2个ebcdic格式文件和2个pdf文件 通过ftp传输到主机上 ebcdic format file 1 is abc xyz ebcdic format file 2 is
  • DLL、内存映射、基地址、内存使用和.NET?

    在开始真正的问题之前 我想说的是 我可能会弄错一些细节 如果是这样 请逮捕我 甚至不要回答我的问题 我的问题基本上是关于 DLL 和 NET 我们有一个应用程序使用了大量内存 我们正在尝试找出如何正确测量内存的方法 特别是当问题主要发生在客
  • 列出 MySQL 表外键的高效方法?

    有没有表演者如何获取分配给 MySQL 表的外键列表 查询信息模式 SELECT column name referenced table schema AS foreign db referenced table name AS fore