在MySQL中使用SELECT语句获取表名

353

在MySQL中,我知道可以通过以下方式列出数据库中的表:

SHOW TABLES

然而,我想将这些表名插入到另一个表中,例如:

INSERT INTO metadata(table_name) SHOW TABLES /* does not work */

是否有一种标准的SELECT语句可以获取表名,例如:

INSERT INTO metadata(table_name) SELECT name FROM table_names /* what should table_names be? */

可能是https://dev59.com/zXVD5IYBdhLWcg3wKoSH的重复问题。 - hafichuk
14个回答

540

获取所有表名可使用以下命令:

SELECT table_name FROM information_schema.tables;

要获取特定数据库中表的名称,请使用以下命令:

SELECT table_name FROM information_schema.tables
WHERE table_schema = 'your_database_name';

现在,为了回答原问题,请使用以下查询:
INSERT INTO table_name
    SELECT table_name FROM information_schema.tables
        WHERE table_schema = 'your_database_name';

更多详情请参见:http://dev.mysql.com/doc/refman/5.0/en/information-schema.html


152

4
这个方向是正确的,但并没有真正回答问题。能否再详细阐述一下? - Murilo Garcia
@MuriloGarcia information_schema是SQL标准的一部分。Postgres也有它。对于SQLite,您可以在sqlite_master中查找。 - Peter Chaula
使用LIKE按名称获取表:SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_NAME LIKE '%keyword%'; - JBB

21
如果我们有多个数据库,并且需要选择特定数据库中的所有表,我们可以使用 TABLE_SCHEMA 来定义数据库名称,例如: select table_name from information_schema.tables where TABLE_SCHEMA='dbname';

11
除了使用INFORMATION_SCHEMA表外,如果要使用SHOW TABLES插入到表中,您可以使用以下命令:
<?php
 $sql = "SHOW TABLES FROM $dbname";
 $result = mysql_query($sql);
 $arrayCount = 0
 while ($row = mysql_fetch_row($result)) {
  $tableNames[$arrayCount] = $row[0];
  $arrayCount++; //only do this to make sure it starts at index 0
 }
 foreach ($tableNames as &$name {
  $query = "INSERT INTO metadata (table_name) VALUES ('".$name."')";
  mysql_query($query);
 }
?>

10

获取所有表名:

SELECT table_name 
FROM information_schema.tables;

如果你需要为特定的数据库获取它:

SELECT table_name 
FROM information_schema.tables
WHERE table_schema = 'your_db_name';

输出:

+--------------------+
| table_name         |
+--------------------+
| myapp              |
| demodb             |
| cliquein           |
+--------------------+
3 rows in set (0.00 sec)

9
SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'DATABASE'

3
请问能否请您在回答中添加更多背景信息?仅有代码的回答很难理解。如果您可以在文章中添加更多信息,将有助于提问者和未来的读者。请不要改变原意,使内容更通俗易懂。 - RBT

8
请查看数据库information_schema中的表格TABLES。它包含关于其他数据库中表格的信息。但如果你使用的是共享主机,可能无法访问该数据库。

7

MySQL的INFORMATION_SCHEMA.TABLES表包含有关表(不是临时的,而是永久的)和视图的数据。列TABLE_TYPE定义了记录是用于表还是视图(对于表,TABLE_TYPE='BASE TABLE',对于视图,TABLE_TYPE='VIEW')。因此,如果您只想查看模式(数据库)中的表,则可以使用以下查询:

SELECT *
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='myschema'

6

5

我认为指出一点可能会有帮助,如果你想选择包含特定单词的表格,可以使用SELECT(而不是SHOW)。下面的查询可以轻松地将搜索范围缩小到包含“关键字”一词的表格。

SELECT *
FROM information_schema.tables
WHERE table_name like "%keyword%"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接