MySQL 15 min read

MySQLでテーブル定義を確認する ― DESCとSHOW CREATE TABLE、列のコメントと索引の見方

※この記事にはアフィリエイト広告(プロモーション)が含まれます。

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でテーブル定義を確認する

MySQL をもっと深く知るための本

MySQL徹底入門 第5版 MySQL 8.4 LTS対応

翔泳社・2025年6月・MySQL 8.4 LTS 対応

MySQL 8.4 に対応した入門書。日本MySQLユーザ会のメンバーが執筆している。

Amazonで見る

MySQL運用・管理[実践]入門 〜安全かつ高速にデータを扱う内部構造・動作原理を学ぶ

技術評論社・2024年5月

内部構造と動作原理から、運用・管理の考え方を学ぶ。

Amazonで見る

Amazonのアソシエイトとして、FIRE SE は適格販売により収入を得ています。