通过一次查询获取数据库架构?

问题描述 投票:0回答:6

基本上我想从当前连接的数据库中获取表名以及每个表的字段名称,仅此而已。

这可能吗?

我知道

SHOW TABLES FROM my_database
会为您提供表名称,而
SHOW COLUMNS FROM my_table
将为您提供字段,但这至少是 [1 x 表数] 查询,我会获得更多我想要的信息:)

php mysql sql database database-schema
6个回答
17
投票

INFORMATION_SCHEMA.COLUMNS 表中有您所要求的内容。

SELECT table_name, column_name
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_schema = 'YourDBName'
    ORDER BY table_name, ordinal_position

4
投票
SELECT t.name AS tblName,
SCHEMA_NAME(schema_id) AS [schemaName],
c.name AS colName
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
ORDER BY tblName;

4
投票
SELECT * 
FROM information_schema.tables t
JOIN information_schema.columns c ON t.TABLE_NAME = c.TABLE_NAME 
 AND t.TABLE_CATALOG=c.TABLE_CATALOG 
 AND t.TABLE_SCHEMA=c.TABLE_SCHEMA

适用于 SQLSERVER 2005。MySQL 的列名称可能有所不同(我假设这就是您正在使用的),但概念是相同的。


1
投票

“显示数据库”、“显示表”和“描述表”是我所知道的 MySql 中最好、最快的方法。

但是它们特定于MySql的。

如果你愿意:

a) 一种查询数据库模式的便携式方法

 ... AND ...

b)对查询进行更精细的控制,然后查看 INFORMATION_SCHEMA:

http://dev.mysql.com/doc/refman/5.0/en/information-schema.html

语法:

SELECT table_name FROM INFORMATION_SCHEMA.TABLES
  WHERE table_schema = 'db_name'
  [AND table_name LIKE 'wild']

0
投票

经过几次试验,我编写了这个 SQL 代码来查看表中的列。

SELECT 
TABLE_NAME as table_name, 
COLUMN_NAME as column_name, 
COLUMN_TYPE as data_type, 
COLUMN_DEFAULT as default_value, 
IS_NULLABLE as nullable,
COLUMN_KEY as constraints, 
EXTRA as constraints2, 
CHARACTER_SET_NAME as charset, 
COLLATION_NAME as collation 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_schema = '<YOUR_DATABASE_NAME>' 
AND TABLE_NAME='<YOUR_TABLE_NAME>' 
ORDER BY table_name, ordinal_position

0
投票

创建以下存储过程,并确保在保存过程之前替换两个位置中的“your_database_name”。

DELIMITER //

CREATE PROCEDURE SummarizeTables()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE tableName CHAR(255);
    DECLARE cur CURSOR FOR 
        SELECT table_name 
        FROM information_schema.tables 
        WHERE table_schema = 'your_database_name'; -- specify your database name here

    -- Handlers
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    -- A temporary table for storing the summary
    DROP TEMPORARY TABLE IF EXISTS TableSummary;
    CREATE TEMPORARY TABLE TableSummary (
        TableName CHAR(255),
        ColumnName CHAR(255),
        DataType CHAR(255),
        IsNullable CHAR(10),
        ColumnKey CHAR(10)
    );

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO tableName;

        IF done THEN
            LEAVE read_loop;
        END IF;

        -- Dynamic SQL to insert table details into the summary table
        SET @s = CONCAT("INSERT INTO TableSummary (TableName, ColumnName, DataType, IsNullable, ColumnKey) 
                        SELECT '", tableName, "', COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_KEY 
                        FROM INFORMATION_SCHEMA.COLUMNS 
                        WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = '", tableName, "'");

        PREPARE stmt FROM @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

    END LOOP;

    CLOSE cur;

    -- Now select the data from the summary table
    SELECT * FROM TableSummary;

END //

DELIMITER ;

然后运行以下sql查询:

CALL SummarizeTables();

这将生成您的架构的汇总表。

© www.soinside.com 2019 - 2024. All rights reserved.