【问题标题】:Sql loop through Database tablesSql 循环遍历数据库表
【发布时间】:2016-02-02 23:33:34
【问题描述】:

在我的数据库中,我有 20 个表。

其中一个名为“Connections”的表包含两列“TableName”和“NextHi”

+--------+-------------+
| NextHi | TableName   |
+--------+-------------+
| 43     | Page        |
+--------+-------------+
| 32     | User        |
+--------+-------------+

所以在“TableName”列中是其他表的名称。

每个其他表都有“Id”列

我需要的是脚本,它将遍历数据库中的所有表,并且每个表都返回一行 3 列:

  1. 表名
  2. MaxID - 表的
  3. 当前表的“连接”表中的 NextHi 值

所以结果应该是这样的:

+-----------+-------------+-------+
| TableName | NextHi      | MaxId |
+-----------+-------------+-------+
| Page      | 43          | 435   |
+-----------+-------------+-------+
| User      | 32          | 768   |
+-----------+-------------+-------+

我有返回这个的脚本,但它对每个表都有选择,并且表名是硬编码的:

(
  SELECT
    "User" as `TableName`,
    `Connections`.`NextHi`,
    (SELECT MAX(`Id`) FROM `User`) as `MaxId`
  FROM `Connections`
  WHERE `Connections`.`TableName` = "User"
)
 UNION ALL (
  SELECT
    "Page" as `TableName`,
    `Connections`.`NextHi`,
    (SELECT MAX(`Id`) FROM `Page`) as `MaxId`
   FROM `Connections`
  WHERE `Connections`.`TableName` = "Page"
)

但我需要这个循环作为一个选择

编辑:

更正:它并不需要只有一个 Select,但它应该比我现在拥有的更简单

【问题讨论】:

  • 所以你的表 Connections 包含你所有的数据库表的列表?
  • 是的,它包含我所有数据库表的列表。同样在该列表中,还有一两个额外的表名不会退出我的数据库。但如果这很重要,我们可以忽略它,我可以删除它们。
  • 我认为这在一个选择中是不可行的,因为您需要使用准备好的语句:stackoverflow.com/questions/19510490/…
  • 能够读取mysql自己的元数据会有帮助吗?例如SELECT table_name FROM information_schema.tables WHERE table_schema='yourdb'

标签: mysql sql


【解决方案1】:
select NextHi, TableName, auto_increment from information_schema.tables,
Connections where table_schema='databaseName' and table_name=TableName;

编辑:发布此内容后,我看到@BryanT 在我测试时已经对此发表了评论。

【讨论】:

  • auto_increment 当然只有在所有提到的表的ID 列都启用了 auto_increment 时才有效。
  • auto_inrement 没有为这些表的 ID 启用。我需要 Max(ID)
【解决方案2】:

你需要一个叫做“动态 SQL”的特性,这个特性在 MySQL 中不太支持,但是it can be done。

您需要编写一个查询,通过查询Connections 生成有效的 SQL 语句,然后执行该语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多