◀ 7.

MySQL/MariaDBのテーブル定義確認|DESC・SHOW CREATEと復旧の範囲

▶

テーブル定義を表示することと、復旧することは別

接続先と権限を確認し、列・索引・制約の表示を完全な復旧と混同しない図

本記事はMySQL / MariaDBのコマンド一覧の子ページです。対象が不明ならテーブル一覧を表示から確認し、SQLでの抽出はメタデータ親ページ、列の詳細はその子のカラム定義の確認へ進めます。親や製品を移動せず、それぞれの目的を分けています。

2026-10-26にMySQL8.4.13 / MariaDB11.8.9-ubu2404で確認した範囲です。画面の表示名や他DBの旧比較は残しますが、全GUI/全版/全負荷の検証や、本番へのDDL/dump実行をした意味ではありません。

1. 新規検体で表示項目を比較する

次の準備は新しく作成した空のcwiki_w28データベースだけに実行します。既存の同名表へ流さず、実データを転載せず、教材のために本番へ作成権限を追加しません。単純列だけでなく複合UNIQUE・生成列・既定値の違いと複合FKを用意しています。

-- New disposable database cwiki_w28 only. No existing tables or data.
CREATE TABLE cwiki_w28.users (
    id INT UNSIGNED NOT NULL PRIMARY KEY,
    email VARCHAR(40) NOT NULL COMMENT 'review email',
    display_name VARCHAR(20) NULL DEFAULT NULL,
    no_default VARCHAR(20) NOT NULL,
    blank_default VARCHAR(20) NOT NULL DEFAULT '',
    generated_length INT GENERATED ALWAYS AS (CHAR_LENGTH(email)) STORED,
    UNIQUE KEY uq_email_id (email,id),
    KEY idx_display (display_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO cwiki_w28.users (id,email,display_name,no_default)
VALUES (1,'a@example.invalid',NULL,'keep A'),(2,'b@example.invalid','B','keep B');
CREATE TABLE cwiki_w28.parents (
    tenant_id INT NOT NULL,
    code INT NOT NULL,
    PRIMARY KEY (tenant_id,code)
) ENGINE=InnoDB;
CREATE TABLE cwiki_w28.children (
    id INT PRIMARY KEY,
    tenant_id INT,
    parent_code INT,
    CONSTRAINT fk_parent_pair FOREIGN KEY (tenant_id,parent_code)
        REFERENCES cwiki_w28.parents (tenant_id,code)
) ENGINE=InnoDB;

接続先/製品/権限を確認したうえで、この検体の表示を比較します。

SHOW FULL COLUMNS FROM cwiki_w28.users;
SHOW CREATE TABLE cwiki_w28.users;

SHOW FULL COLUMNSは列の情報で、索引の全列順や別オブジェクトの定義を全て示すものではありません。DefaultがNULLでも「DEFAULT NULLが明示された列」と「既定値のないNOT NULL列」を同じと判断せず、SHOW CREATEの定義とNULL許容を合わせます。検体のdisplay_name/no_defaultはどちらも表示上のDefaultがNULL、blank_defaultは空文字でした。

列権限をid/emailだけに限定した別接続は、SHOW FULL COLUMNSで2列だけが見え、SHOW CREATE TABLEは1142で拒否されました。列が見えることと表の完全な定義を取得できることは別です。拒否された照会を通すために本番権限を拡大しません。

2. SHOW CREATEの出力に含まれないものを確認する

検体には2行と別のtriggerを作りましたが、SHOW CREATE TABLEの出力には行の値もCREATE TRIGGERも含まれませんでした。1表の表示だけで全データ・trigger/view・権限・参照元・依存・環境設定まで復元できるわけではありません。元のCREATE入力の書式とも一致するとは限らず、CHECK等の表示方法や製品/設定差も確認します。SQLだけでなく接続先の版/engine/条件も記録します。

表示をそのまま実表へCREATEし直す手順には進めません。復旧用途なら対象・依存/行・権限/秘密情報・整合した取得条件・復元先・実際の復元試験を別に設計します。今回の照会成功は本番backupや完全復旧の演習結果ではありません。

3. dumpとスクリプト出力の範囲を決める

旧章のmysqldump -d/--no-dataは行を出力しない指定で、全オブジェクト/権限まで自動的に含むという意味ではありません。routines/events/trigger等の選択、対応製品/クライアント版、取得時のlock/整合性と必要権限も調べます。root指定を標準の準備にせず、既存ファイルへのリダイレクト上書きや、出力されたDROP/CREATE/SETの実行にも注意します。今回は旧dumpコマンド/全GUIの実行は未検証です。

DDLをGitへ置く場合も、内部名/DEFINER/接続情報や行データ混入、環境固有差を点検します。migrationや生成物のどれを正本とするかは既存運用から決め、差分を見つけただけでmigrate/import/表の作り直しを実行しません。CWiki自体ではmigrateを実行しません。

この記事の要点
  • DESC tablename; が一番手軽。列名・型・NULL 可否・キー・デフォルト・Extra が見える
  • SHOW CREATE TABLE tablename; は対象表のDDLを表示する。単独でデータ/全依存の完全復旧になるわけではない
  • information_schema.COLUMNS を直接 SELECT すれば、メタ情報を WHERE で絞れる
  • mysqldump -d database table で定義のみ出力。-d = no-data
  • PostgreSQL は \d+ tablename (psql) / SQL Server は sp_help "tablename"
  • インデックスは SHOW INDEX FROM tablename で別途確認

DESC — 簡易に列定義を見る

旧例の注意:出力は例です。Key/Defaultは要約で、生成列/複合キー/権限による欠落を別に照合します。

DESC users;
-- または DESCRIBE users;
-- または EXPLAIN users;
-- +------------+--------------+------+-----+-------------------+----------------+
-- | Field      | Type         | Null | Key | Default           | Extra          |
-- +------------+--------------+------+-----+-------------------+----------------+
-- | id         | bigint       | NO   | PRI | NULL              | auto_increment |
-- | name       | varchar(255) | NO   |     | NULL              |                |
-- | email      | varchar(255) | NO   | UNI | NULL              |                |
-- | created_at | datetime     | NO   |     | CURRENT_TIMESTAMP |                |
-- +------------+--------------+------+-----+-------------------+----------------+
列意味
Field列名
Typeデータ型(長さ・符号付き有無含む)
NullNULL 許可(YES/NO)
KeyKeyは要約表示。複合UNIQUEでもMUL、NOT NULL UNIQUEがPRIとなる条件等があり、全索引/制約を別途照合
Default表示上の既定値。NULLはDEFAULT NULLと既定句なしを区別できない場合がある
Extraauto_increment / on update CURRENT_TIMESTAMP / VIRTUAL GENERATED 等

SHOW COLUMNS — DESC と同じ

旧例の注意:対象DB/表/可視列とFULL/LIKEの条件を確認し、どのクライアントにも同じ表示を保証しません。

SHOW COLUMNS FROM users;
SHOW FULL COLUMNS FROM users;        -- 照合順序・コメント等も
SHOW COLUMNS FROM users LIKE 'email%';
SHOW COLUMNS FROM myapp.users;       -- 別 DB

SHOW CREATE TABLE — 出力と確認範囲

対象表のCREATE定義を表示します。元入力の書式や行/trigger/権限/全依存の復旧は保証しません:

旧例の注意:\Gはmysql系クライアントの表示指定です。出力に行/trigger/全依存は含まれず、実表へ再作成する案内ではありません。

SHOW CREATE TABLE users\G
-- *************************** 1. row ***************************
--        Table: users
-- Create Table: CREATE TABLE `users` (
--   `id` bigint unsigned NOT NULL AUTO_INCREMENT,
--   `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
--   `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
--   `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
--   PRIMARY KEY (`id`),
--   UNIQUE KEY `users_email_unique` (`email`),
--   KEY `users_created_at_index` (`created_at`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

使いどころ: 「本番と staging の定義差分」「テストデータ環境の再現」「ORM が生成した DDL の確認」。

information_schema を直接 SELECT

プログラムからメタ情報を取得したい場合や、複雑な条件で絞り込みたい場合は information_schema を使います:

旧例の注意:型の文字数/符号/照合・生成式と可視範囲を確認します。除外DB条件だけでは対象を十分限定できない場合があり、schema/表を絞ります。

-- テーブルの全列定義
SELECT column_name, column_type, is_nullable, column_default, column_key, extra, column_comment
FROM information_schema.COLUMNS
WHERE table_schema = 'myapp' AND table_name = 'users'
ORDER BY ordinal_position;

-- 「全テーブルの中で created_at という列を持つテーブル」を探す
SELECT table_schema, table_name
FROM information_schema.COLUMNS
WHERE column_name = 'created_at' AND table_schema NOT IN ('mysql','sys','information_schema');

-- VARCHAR(255) 以上の列を一覧(型変更影響調査)
SELECT table_name, column_name, column_type
FROM information_schema.COLUMNS
WHERE table_schema = 'myapp'
  AND data_type = 'varchar' AND character_maximum_length >= 255;

インデックス・キー制約の確認

旧例の注意:SHOW INDEXと制約を分け、FKは参照schema/複合列順も照合します。この旧例だけで全制約を把握したと扱いません。

-- インデックス一覧
SHOW INDEX FROM users;
-- +-------+------------+--------------------+--------------+-------------+
-- | Table | Non_unique | Key_name           | Seq_in_index | Column_name |
-- +-------+------------+--------------------+--------------+-------------+
-- | users |          0 | PRIMARY            |            1 | id          |
-- | users |          0 | users_email_unique |            1 | email       |

-- 外部キー制約
SELECT constraint_name, table_name, column_name, referenced_table_name, referenced_column_name
FROM information_schema.KEY_COLUMN_USAGE
WHERE table_schema = 'myapp' AND referenced_table_name IS NOT NULL;

mysqldump で定義のみ出力

旧例の注意:未実行の旧dump例です。rootを準備の既定にせず、版/権限/lock/整合性/出力範囲を確認します。リダイレクトは既存ファイルを上書きし、出力のDROP等を実環境へ自動実行しません。

# -d / --no-data: データ無し、定義のみ
mysqldump -uroot -p -d myapp > schema.sql

# 特定テーブルだけ
mysqldump -uroot -p -d myapp users orders > users_orders_schema.sql

# テーブル定義 + 既存データの SQL
mysqldump -uroot -p myapp users > users_full.sql

# DROP TABLE 文も含めない
mysqldump -uroot -p -d --skip-add-drop-table myapp > schema_clean.sql

# ストアドプロシージャ・トリガ・ビューも含める
mysqldump -uroot -p -d --routines --triggers --events myapp > full_schema.sql

GUI ツール

以下は既存の画面操作の案内です。版/表示言語/権限で異なり、今回全GUIでの再現は未検証です。

  • phpMyAdmin: テーブルを選択 → 「構造」タブ
  • DBeaver: テーブル右クリック → Properties / DDL タブ
  • MySQL Workbench: 右クリック → Send to SQL Editor → Create Statement
  • HeidiSQL: テーブル右クリック → Show CREATE code
  • TablePlus: テーブルをダブルクリック → Structure

他 DBMS での同等操作

DBMS列定義DDL/定義の確認(取得範囲も確認)
MySQLDESC tblSHOW CREATE TABLE tbl
PostgreSQL (psql)\d tbl\d+ tblは表示用、DDL抽出はpg_dump -s -t tbl db等。依存の範囲も別途確認
SQL Serversp_help 'tbl'SSMS で右クリック → Script Table as → CREATE
OracleDESC tblDBMS_METADATA.GET_DDL('TABLE','TBL')
SQLite.schema tblSELECT sql FROM sqlite_master WHERE name='tbl'

FAQ

Q: 列のコメント (COMMENT) も見たい
A: SHOW FULL COLUMNS FROM tbl; または information_schema.COLUMNS.column_comment。

Q: テーブルのコメント・エンジン・行数を確認
A: SHOW TABLE STATUS等で確認できますが、対象名/権限とengineの条件を調べます。InnoDBのRowsやサイズは推定/観測値で、現在の正確な行数や回収可能な容量ではありません。

Q: DDL を Git にコミットしたい
A: 出力対象/秘密情報/環境固有差と実際の復元条件を点検します。migration/生成物の正本は既存運用に合わせ、差分だけを理由にmigrate/importを実行しません。CWikiではmigrateを実行しません。

元の書式付き定義確認コマンド

元v5の比較表/SQLを保持します。別の一般SQLカテゴリへのリンクも製品差を確認して参照し、既存カテゴリの移動とは扱いません。元v3のテーブル一覧への導線は冒頭へ戻しました。

MariaDB / MySQL でテーブルの列構成・型・制約などのテーブル定義を確認する方法を紹介します。日々の運用で、CREATE TABLE 文を都度引っ張り出さなくても、コマンド一発で構造を確認できます。

1. もっとも簡単な方法: DESC

旧例の注意:簡易表示の例です。Key/Defaultだけで全制約やDEFAULT句の有無を断定しません。

DESC テーブル名;
-- 同義
DESCRIBE テーブル名;
EXPLAIN テーブル名;

列名・型・NULL 許可・キー・デフォルト値・Extra (AUTO_INCREMENT 等) が一覧表示されます。日常的な確認はこれで足ります。

2. より詳細に: SHOW FULL COLUMNS

権限・コメント・照合順序などまで含めて確認したい場合は SHOW FULL COLUMNS を使います。

旧例の注意:可視な列の情報です。対象schema/表/権限とクライアントの表示を確認します。

SHOW FULL COLUMNS FROM テーブル名;

3. CREATE 文の再現: SHOW CREATE TABLE

テーブルを再作成できる形の DDL を取得したい場合に便利です。表に含まれる定義を確認しますが、行/trigger/権限/全依存の完全復旧を保証する表示ではありません。

旧例の注意:単独のCREATE表示は行や全依存を含まず、出力を実表へ再実行する案内ではありません。

SHOW CREATE TABLE テーブル名;

4. インデックス・キー情報の確認

旧例の注意:索引と制約は別です。列順/一意性/長さ/式やFK依存も確認します。

SHOW INDEX FROM テーブル名;
SHOW KEYS  FROM テーブル名;

5. INFORMATION_SCHEMAでの取得

スクリプトや管理画面から取得する場合は、information_schema 内のシステムビューを SELECT すると扱いやすいです。

旧例の注意:schema/表名と列順を限定した旧読取例です。製品固有項目を全DB共通としません。

SELECT column_name, column_type, is_nullable, column_default, column_comment
  FROM information_schema.columns
 WHERE table_schema = 'DB名'
   AND table_name   = 'テーブル名'
 ORDER BY ordinal_position;

主な確認コマンドの比較

コマンド得られる情報用途
DESC / DESCRIBE列名・型・NULL・キー・デフォルト・Extra日常的な確認
SHOW FULL COLUMNS上記+照合順序・権限・コメント権限・コメントも見たいとき
SHOW CREATE TABLE対象表のDDL。データ/全依存のbackupとは別定義のバックアップ・他環境へのコピー
SHOW INDEXインデックス情報のみ性能調査・索引確認
information_schema.columns同上をテーブルとして扱えるスクリプト・管理画面

関連

確認範囲と一次資料

新規の小規模InnoDB検体と限定した読取権限で確認した範囲です。全負荷/全権限/全製品・全GUI/旧dumpの実行・本番復旧/既存アプリの全設定を保証せず、調査のために本番設定/依存/権限を追加していません。

子ページ

子ページはありません

同階層のページ
  1. MySQLの起動(Windows)
  2. MySQLの起動、停止、再起動(Linux)
  3. MYSQL への接続
  4. データベース一覧の表示
  5. データベースへの接続
  6. テーブル一覧を表示
  7. テーブル定義を確認
  8. ユーザーおよびパスワード一覧の確認

最近更新/作成されたページ