※この記事にはアフィリエイト広告(プロモーション)が含まれます。
MySQL で表の列と型を見るには DESC 表名 を使います。DESCRIBE と SHOW COLUMNS FROM も同じ結果を返します。この記事の出力は MySQL 8.4.11(Ubuntu 26.04 の標準パッケージ)で採りました。
まず見る(結論)
| 見たいもの | コマンド |
|---|---|
| 列名・型・NULL 可否・既定値 | DESC 表名; |
| 上に加えて列のコメント・照合順序 | SHOW FULL COLUMNS FROM 表名; |
| 作り直せる CREATE 文(索引・文字コード・表のコメント込み) | SHOW CREATE TABLE 表名\G |
| 索引ごとの列の並び | SHOW INDEX FROM 表名; |
| SQL で絞り込む・加工する | information_schema.COLUMNS |
DESC で列を見る
次の表を例にします。
CREATE TABLE orders (
id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '注文ID',
customer_id int NOT NULL,
code char(10) NOT NULL,
status enum('new','paid','shipped') NOT NULL DEFAULT 'new',
amount decimal(10,2) DEFAULT NULL,
note varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_code (code),
KEY idx_customer (customer_id, created_at)
) COMMENT='注文';
mysql> DESC orders;
+-------------+------------------------------+------+-----+-------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------------------+------+-----+-------------------+-------------------+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| customer_id | int | NO | MUL | NULL | |
| code | char(10) | NO | UNI | NULL | |
| status | enum('new','paid','shipped') | NO | | new | |
| amount | decimal(10,2) | YES | | NULL | |
| note | varchar(200) | YES | | NULL | |
| created_at | datetime | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+-------------+------------------------------+------+-----+-------------------+-------------------+
Key 列は、その列が索引の先頭に入っているかを示します。
PRI… 主キーUNI… 一意索引MUL… 同じ値を複数行に入れられる索引の先頭列
created_at は idx_customer の2番目の列ですが、Key は空です。複合索引の2列目以降は DESC では分からないので、SHOW INDEX で見ます。
列が多い表で特定の列だけ見たいときは、DESC orders customer_id; のように列名を続けるか、SHOW COLUMNS FROM orders LIKE 'c%'; で絞ります。
コメントと照合順序まで見る
mysql> SHOW FULL COLUMNS FROM orders;
+-------------+-----------------+--------------------+------+-----+ ... +----------+
| Field | Type | Collation | Null | Key | ... | Comment |
+-------------+-----------------+--------------------+------+-----+ ... +----------+
| id | bigint unsigned | NULL | NO | PRI | ... | 注文ID |
| code | char(10) | utf8mb4_0900_ai_ci | NO | UNI | ... | |
| note | varchar(200) | utf8mb4_bin | YES | | ... | |
...
FULL を付けると Collation・Privileges・Comment の3列が増えます。note だけ utf8mb4_bin になっています。列ごとに照合順序が違う表では、ここを見ないと比較結果の違いに気づけません。
CREATE 文を出す
mysql> SHOW CREATE TABLE orders\G
*************************** 1. row ***************************
Table: orders
Create Table: CREATE TABLE `orders` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '注文ID',
...
`note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
...
KEY `idx_customer` (`customer_id`,`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='注文'
作るときに省いた DEFAULT NULL、ストレージエンジン(ENGINE=InnoDB)、表の文字コードまで補って出ます。別の環境に同じ表を作るときや、定義を比べるときはこれを使います。末尾の \G は結果を縦に並べる指定です。; で終えると横長の1行になり、読みにくくなります(\G の記事)。
索引を見る
mysql> SHOW INDEX FROM orders;
+--------+------------+--------------+--------------+-------------+ ...
| Table | Non_unique | Key_name | Seq_in_index | Column_name | ...
+--------+------------+--------------+--------------+-------------+ ...
| orders | 0 | PRIMARY | 1 | id | ...
| orders | 0 | uk_code | 1 | code | ...
| orders | 1 | idx_customer | 1 | customer_id | ...
| orders | 1 | idx_customer | 2 | created_at | ...
+--------+------------+--------------+--------------+-------------+ ...
1つの索引は列の数だけ行に分かれて出ます。Seq_in_index が索引の中での順番です。Non_unique が 0 なら一意索引です。
SQL で取り出す
列の一覧を加工したいときは information_schema.COLUMNS を SELECT します。
mysql> SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_KEY, COLUMN_COMMENT
-> FROM information_schema.COLUMNS
-> WHERE TABLE_SCHEMA = 'fsv' AND TABLE_NAME = 'orders'
-> ORDER BY ORDINAL_POSITION;
mysql> SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY ORDINAL_POSITION)
-> FROM information_schema.COLUMNS
-> WHERE TABLE_SCHEMA = 'fsv' AND TABLE_NAME = 'orders';
+-----------------------------------------------------+
| GROUP_CONCAT(COLUMN_NAME ORDER BY ORDINAL_POSITION) |
+-----------------------------------------------------+
| id,customer_id,code,status,amount,note,created_at |
+-----------------------------------------------------+
2つ目は列名をカンマでつないだもので、INSERT 文の列リストを作るときに使えます。ORDER BY ORDINAL_POSITION を付けないと、表の列の順に並ぶ保証はありません。
DESC に SELECT を続けると EXPLAIN になる
mysql> DESC SELECT * FROM orders WHERE customer_id = 1;
+----+-------------+--------+------------+------+---------------+--------------+ ...
| id | select_type | table | partitions | type | possible_keys | key | ...
+----+-------------+--------+------------+------+---------------+--------------+ ...
| 1 | SIMPLE | orders | NULL | ref | idx_customer | idx_customer | ...
MySQL では DESC・DESCRIBE・EXPLAIN は同じ命令です。後ろに表名を書けば列の一覧、SELECT 文を書けば実行計画になります。EXPLAIN orders; と書いても列の一覧が出ました。
エラーになる場合
| エラー | 原因 |
|---|---|
ERROR 1046 (3D000): No database selected |
USE していない。DESC fsv.orders とデータベース名を付けるか、先に USE fsv; を実行する |
ERROR 1146 (42S02): Table 'fsv.order' doesn't exist |
表名の誤り。Linux の既定では Orders と orders も別の名前として扱われ、同じエラーになる |
関連: MySQLでテーブル一覧を表示する / MySQLでデータベース一覧を表示する / PostgreSQLでテーブル定義を確認する