H2資料庫中的DESC指令
1. 概述
H2 資料庫是一種輕量級開源關係資料庫引擎,被 Java 開發人員廣泛用於滿足測試、原型設計和輕量級儲存需求。雖然 H2 支援許多標準 SQL 命令並且具有強大的功能集,但它不支援常用的DESC
(或DESCRIBE
)命令來檢查表結構。
在本教程中,我們將了解如何在 H2 中查看表元數據,探索DESC
的一些有效替代方案,並透過實際範例進行操作。
2. 理解DESC
指令
[DESC](https://docs.oracle.com/en/database/oracle/oracle-database/21/sqpug/DESCRIBE.html)
指令在 SQL 中經常用於描述表或視圖的結構,提供有關列名、資料類型和約束的元資料。對於需要快速概述表架構而無需參考建立表的原始 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
:保存有關表、視圖和其他資料庫物件的元數據
PUBLIC
模式是我們找到EMPLOYEE
表的地方,因為除非另有指定,否則預設情況下它是在那裡創建的。
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
命令,該命令列出表格中的所有欄位及其資料類型和約束。
讓我們看看EMPLOYEE
表中的欄位:
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.列印模式
要查看H2資料庫中的所有模式,我們可以查詢SCHEMATA
表:
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA;
同樣,這會傳回 H2 實例中的模式:
+------------------+
|SCHEMA_NAME |
+------------------+
|INFORMATION_SCHEMA|
|PUBLIC |
+------------------+
除了模式名稱之外, SCHEMATA表還提供有關每個模式的更多信息,例如模式所有者和編碼,這些詳細資訊透過SHOW
命令無法獲得。
5.2.列印台
要使用INFORMATION_SCHEMA
檢索資料庫中的所有表,我們可以查詢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
表。這提供了每列的元數據,包括數據類型和約束。
讓我們再次檢索EMPLOYEE
表的列詳細資訊:
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
命令不顯示註解或某些約束,但如果需要,我們可以從INFORMATION_SCHEMA
表中檢索它們。
六、結論
儘管缺乏直接的DESC
命令,H2 資料庫提供了透過SHOW
命令和INFORMATION_SCHEMA
表檢索詳細元資料的靈活方法。
SHOW
命令提供對模式、表和列的快速、直接的訪問,而INFORMATION_SCHEMA
提供更全面和可自訂的元資料查詢,涵蓋附加信息,例如資料類型、預設值、鍵,甚至列上的註釋。
透過有效地使用這兩種方法,我們可以輕鬆檢查和管理 H2 資料庫元數據,確保順利的開發體驗。