4.

テーブル定義を確認する SQL コマンド (DESC / SHOW FULL COLUMNS)

編集
この記事の要点
  • DB のテーブル定義(カラム・型・制約)を確認する方法
  • MySQL: DESC table_name / SHOW CREATE TABLE
  • PostgreSQL: \d table_name (psql) / information_schema
  • Oracle: DESC table / USER_TAB_COLUMNS
  • SQL Server: EXEC sp_help table_name / sys.columns

 

MySQL

-- 簡易表示
DESC users;
DESCRIBE users;

-- 結果例
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | bigint       | NO   | PRI | NULL    | auto_increment |
| name       | varchar(100) | NO   |     | NULL    |                |
| email      | varchar(255) | YES  | UNI | NULL    |                |
| created_at | timestamp    | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

-- CREATE TABLE 文を取得 (詳細)
SHOW CREATE TABLE users\G

-- 結果
CREATE TABLE `users` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email_unique` (`email`),
  KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

-- インデックス確認
SHOW INDEX FROM users;

-- テーブル一覧
SHOW TABLES;

-- DB 全体
SHOW DATABASES;

-- 全カラム情報 (information_schema)
SELECT * FROM information_schema.columns
WHERE table_schema = 'mydb' AND table_name = 'users';

-- すべてのテーブルの行数
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema = 'mydb';

PostgreSQL

-- psql コマンド
\d users         -- カラム + インデックス
\d+ users        -- 詳細 (コメント含む)
\dt              -- テーブル一覧
\dn              -- スキーマ一覧
\df              -- 関数一覧
\du              -- ユーザー一覧

-- 結果例
                                Table "public.users"
   Column   |            Type             | Collation | Nullable |              Default
------------+-----------------------------+-----------+----------+-----------------------------------
 id         | bigint                      |           | not null | nextval('users_id_seq'::regclass)
 name       | character varying(100)      |           | not null |
 email      | character varying(255)      |           |          |
 created_at | timestamp without time zone |           |          | CURRENT_TIMESTAMP
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "users_email_key" UNIQUE CONSTRAINT, btree (email)

-- information_schema
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'users';

-- 制約
SELECT conname, contype, pg_get_constraintdef(oid)
FROM pg_constraint
WHERE conrelid = 'users'::regclass;

-- インデックス
SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'users';

Oracle

-- SQL*Plus
DESC users;
DESCRIBE users;

-- 結果
 Name       Null?    Type
 ---------- -------- ---------------
 ID         NOT NULL NUMBER(19)
 NAME       NOT NULL VARCHAR2(100 CHAR)
 EMAIL               VARCHAR2(255 CHAR)
 CREATED_AT          TIMESTAMP(6)

-- USER_TAB_COLUMNS で詳細
SELECT column_name, data_type, data_length, nullable, data_default
FROM user_tab_columns
WHERE table_name = 'USERS';

-- 全テーブル
SELECT table_name FROM user_tables;

-- 制約
SELECT constraint_name, constraint_type, search_condition
FROM user_constraints
WHERE table_name = 'USERS';

-- インデックス
SELECT index_name, column_name
FROM user_ind_columns
WHERE table_name = 'USERS';

-- CREATE TABLE 文を取得
SELECT DBMS_METADATA.GET_DDL('TABLE', 'USERS') FROM DUAL;

SQL Server

-- sp_help
EXEC sp_help 'users';
-- → カラム・インデックス・制約を表示

-- sp_columns
EXEC sp_columns 'users';

-- sys.columns (詳細)
SELECT
    c.name AS column_name,
    t.name AS data_type,
    c.max_length,
    c.precision,
    c.scale,
    c.is_nullable,
    c.is_identity
FROM sys.columns c
JOIN sys.types t ON c.user_type_id = t.user_type_id
WHERE c.object_id = OBJECT_ID('users');

-- information_schema
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'users';

-- 全テーブル
SELECT name FROM sys.tables;
-- または
SELECT table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE';

SQLite

-- SQLite シェル
.schema users           -- CREATE TABLE 文
.schema                 -- 全テーブル
.tables                 -- テーブル一覧
.columns                -- 全カラム

-- SQL で
SELECT sql FROM sqlite_master WHERE type='table' AND name='users';

-- カラム情報
PRAGMA table_info(users);
-- 結果: cid, name, type, notnull, dflt_value, pk

-- インデックス
PRAGMA index_list(users);
PRAGMA index_info(idx_users_email);

-- 外部キー
PRAGMA foreign_key_list(orders);

GUI ツール

  • MySQL Workbench: MySQL 公式 GUI
  • pgAdmin: PostgreSQL 公式
  • SQL Developer: Oracle 公式
  • SSMS: SQL Server Management Studio
  • DBeaver: 全 DB 対応マルチプラットフォーム
  • TablePlus: モダン UI、有料
  • HeidiSQL: Windows 向け軽量
  • DataGrip: JetBrains 製、有料

テーブル間の関係を可視化

-- MySQL: 外部キー一覧
SELECT
    constraint_name,
    table_name,
    column_name,
    referenced_table_name,
    referenced_column_name
FROM information_schema.key_column_usage
WHERE referenced_table_name IS NOT NULL
  AND table_schema = 'mydb';

-- PostgreSQL: 外部キー
SELECT
    tc.constraint_name,
    tc.table_name,
    kcu.column_name,
    ccu.table_name AS foreign_table,
    ccu.column_name AS foreign_column
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu USING (constraint_name)
JOIN information_schema.constraint_column_usage ccu USING (constraint_name)
WHERE tc.constraint_type = 'FOREIGN KEY';

ER 図の自動生成

  • MySQL Workbench: Database → Reverse Engineer
  • DBeaver: スキーマ右クリック → Generate ERD
  • dbdiagram.io: SQL から自動描画
  • SchemaSpy: コマンドラインで HTML レポート生成
  • SQLAlchemy + graphviz: Python で生成

テーブルサイズ確認

-- MySQL
SELECT
    table_name,
    ROUND(data_length / 1024 / 1024, 2) AS data_mb,
    ROUND(index_length / 1024 / 1024, 2) AS index_mb,
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_mb,
    table_rows
FROM information_schema.tables
WHERE table_schema = 'mydb'
ORDER BY (data_length + index_length) DESC;

-- PostgreSQL
SELECT
    schemaname,
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;

-- Oracle
SELECT segment_name, bytes/1024/1024 AS size_mb
FROM user_segments
WHERE segment_type = 'TABLE'
ORDER BY bytes DESC;

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. DB接続コマンド
  2. データベース一覧の確認
  3. テーブル一覧の確認
  4. テーブル定義の確認
  5. DBの設定確認
  6. テーブルスペースの容量の確認および拡張
  7. データ型
  8. 複数カラムのUPDATE
  9. カラムの追加/削除/変更
  10. 自動番号付け (autoincrement) する方法
  11. インデックスの作成
  12. シーケンスおよびインクリメント(ID列)の違いと確認方法
  13. create table文の生成
  14. 特定スキーマの全テーブルの全カラム情報を取得する方法
  15. 【DB2】エラー一覧
  16. 【DB2】テーブル定義からCREATE TABLE文を生成する方法