1. 概述

H2数据库是一款轻量级开源关系型数据库引擎,广泛用于Java开发中的测试、原型设计和轻量级存储场景。虽然H2支持大多数标准SQL命令且功能强大,但它并不支持常用的DESC(或DESCRIBE)命令来查看表结构。

本文将探讨如何在H2中查看表元数据,提供DESC的有效替代方案,并通过实际案例演示。

2. 理解DESC命令

DESC命令在SQL中常用于描述表或视图的结构,提供列名、数据类型和约束等元数据信息。这对需要快速了解表结构的开发者和DBA非常实用,无需查阅创建表的原始SQL脚本。

但⚠️ H2明确不支持DESC命令。我们可以使用SHOW命令或查询内置的INFORMATION_SCHEMA表来获取类似元数据。

3. 搭建示例环境

为演示H2中DESC的替代方案,先创建示例表:

CREATE TABLE EMPLOYEE (
    ID INT PRIMARY KEY,
    NAME VARCHAR(50) NOT NULL,
    AGE INT COMMENT 'The age of an employee',
    SALARY DECIMAL(15, 2) DEFAULT 1000.0
);

该表包含多种数据类型、主键、空值约束、默认值和列注释。

由于H2原生不支持DESC,执行时会报错:

Syntax error in SQL statement "DESC EMPLOYEE[*]"; expected "ALTER, ANALYZE, COMMENT,
  COMMIT, CREATE, DELETE, DROP, EXPLAIN, GRANT, INSERT, MERGE, PREPARE, REVOKE, ROLLBACK,
  SELECT, SET, SHOW, TRUNCATE, UPDATE, UPSERT"; SQL statement:
DESC EMPLOYEE [42001-214]

而在Oracle等数据库中,相同命令可正常返回:

+--------+------------------+----------+-----+---------+------------------------+
| COLUMN | DATA TYPE        | NULLABLE | KEY | DEFAULT | REMARK                 |
+--------+------------------+----------+-----+---------+------------------------+
| ID     | NUMBER           | NO       | PRI | NULL    | NULL                   |
| NAME   | VARCHAR2(50)     | NO       |     | NULL    | NULL                   |
| AGE    | NUMBER           | YES      |     | NULL    | The age of an employee |
| SALARY | NUMBER(15, 2)    | YES      |     | 1000.0  | NULL                   |
+--------+------------------+----------+-----+---------+------------------------+

因此必须采用替代方法获取表元数据,后续章节将详细说明。

4. 使用SHOW命令

H2的SHOW命令是DESC的简单粗暴替代方案,可快速获取元数据。通过SHOW可列出模式、表、视图及指定表的列信息。

4.1. 查看模式

显示所有可用模式:

SHOW SCHEMAS;

返回当前H2实例中的模式:

+------------------+
|SCHEMA_NAME       |
+------------------+
|INFORMATION_SCHEMA|
|PUBLIC            |
+------------------+

H2默认有两个核心模式:

  • PUBLIC:包含所有用户创建的表和对象(除非指定其他模式)
  • INFORMATION_SCHEMA:存储表、视图等数据库对象的元数据

我们的EMPLOYEE表默认位于PUBLIC模式。

4.2. 查看表

列出所有表:

SHOW TABLES;

返回可用表及其所属模式:

+----------+------------+
|TABLE_NAME|TABLE_SCHEMA|
+----------+------------+
|EMPLOYEE  |PUBLIC      |
+----------+------------+

查看指定模式中的表:

SHOW TABLES FROM INFORMATION_SCHEMA;

返回该模式下的所有视图和元数据表:

+-----------------+------------------+
|TABLE_NAME       |TABLE_SCHEMA      |
+-----------------+------------------+
|CHECK_CONSTRAINTS|INFORMATION_SCHEMA|
|COLLATIONS       |INFORMATION_SCHEMA|
|COLUMNS          |INFORMATION_SCHEMA|
...

4.3. 查看列结构

使用SHOW COLUMNS查看指定表的列结构:

SHOW COLUMNS FROM EMPLOYEE;

返回表结构信息:

+------+---------------------+----+---+-------+
|FIELD |TYPE                 |NULL|KEY|DEFAULT|
+------+---------------------+----+---+-------+
|ID    |INTEGER              |NO  |PRI|NULL   |
|NAME  |CHARACTER VARYING(50)|NO  |   |NULL   |
|AGE   |INTEGER              |YES |   |NULL   |
|SALARY|DECIMAL(15, 2)       |YES |   |1000.0 |
+------+---------------------+----+---+-------+

虽然该命令简单直接,能提供列名、类型和约束等核心信息,但❌ 不包含注释或其他扩展元数据。更全面的信息需要直接查询INFORMATION_SCHEMA

5. 使用INFORMATION_SCHEMA获取详细元数据

当需要比SHOW命令更灵活和详细的信息时,INFORMATION_SCHEMA是强大替代方案。通过查询元数据表,可获取模式、表、列等对象的全面信息。

5.1. 查看模式

查询SCHEMATA表获取所有模式:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA;

返回H2实例中的模式:

+------------------+
|SCHEMA_NAME       |
+------------------+
|INFORMATION_SCHEMA|
|PUBLIC            |
+------------------+

除模式名外,SCHEMATA表还提供模式所有者、编码等额外信息(SHOW命令无法获取)。

5.2. 查看表

通过TABLES表获取所有表信息:

SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES;

输出结果:

+----------+------------+
|TABLE_NAME|TABLE_SCHEMA|
+----------+------------+
|EMPLOYEE  |PUBLIC      |
+----------+------------+

使用WHERE子句过滤特定模式:

SELECT TABLE_NAME, TABLE_SCHEMA 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'INFORMATION_SCHEMA';

返回指定模式下的元数据表:

+-----------------+------------------+
|TABLE_NAME       |TABLE_SCHEMA      |
+-----------------+------------------+
|CHECK_CONSTRAINTS|INFORMATION_SCHEMA|
|COLLATIONS       |INFORMATION_SCHEMA|
|COLUMNS          |INFORMATION_SCHEMA|
...

5.3. 查看列详情

查询COLUMNS表获取详细列信息:

SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, REMARKS
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'EMPLOYEE';

返回列的完整元数据:

+----------------+-----------+-----------------+-----------+--------------+-----------------------+
|ORDINAL_POSITION|COLUMN_NAME|DATA_TYPE        |IS_NULLABLE|COLUMN_DEFAULT|REMARKS                |
+----------------+-----------+-----------------+-----------+--------------+-----------------------+
|1               |ID         |INTEGER          |NO         |null          |null                   |
|2               |NAME       |CHARACTER VARYING|NO         |null          |null                   |
|3               |AGE        |INTEGER          |YES        |null          |The age of the employee|
|4               |SALARY     |NUMERIC          |YES        |1000.0        |null                   |
+----------------+-----------+-----------------+-----------+--------------+-----------------------+

SHOW COLUMNS相比,查询COLUMNS表的优势在于:

  • ✅ 提供更多元数据(如列序号、注释)
  • ✅ 支持自定义过滤(如按特定列或属性筛选)
  • ✅ 可获取SHOW命令不支持的注释和约束信息

6. 总结

尽管H2数据库没有直接的DESC命令,但通过SHOW命令和INFORMATION_SCHEMA表提供了灵活的元数据查询方案:

方法 优势 适用场景
SHOW命令 ✅ 简单快速
✅ 基础元数据覆盖
快速查看模式/表/列结构
INFORMATION_SCHEMA ✅ 信息全面
✅ 支持自定义查询
✅ 包含注释/约束等扩展信息
需要详细元数据或定制化查询

掌握这两种方法,就能轻松应对H2数据库的元数据查询需求,提升开发效率。


原始标题:DESC Command in H2 Database | Baeldung