13.

既存テーブルから CREATE TABLE 文を生成する方法(MySQL / PG / SQL Server / SQLite)

編集
この記事の要点
  • MySQL / MariaDB: SHOW CREATE TABLE tbl; または mysqldump -d dbname tbl(-d = データなし、定義のみ)
  • PostgreSQL: pg_dump -s --table=tbl dbname。psql 内では \d+ tbl で疑似的に確認
  • SQL Server: SSMS で テーブルを右クリック → Script Table As → CREATE To → New Query
  • SQLite: .schema tbl または SELECT sql FROM sqlite_master WHERE name="tbl"
  • GUI で一括: DBeaver / phpMyAdmin / pgAdmin はテーブル右クリック → DDL / Generate SQL
  • マイグレーションファイル化: Laravel php artisan migrate:generate (パッケージ) で Schema::create 文に変換

なぜ CREATE TABLE 文を取り出したいか

  • テーブル定義を 別環境にコピー(本番 → 開発 / ステージング)
  • 定義のバージョン管理(git で .sql を追跡)
  • マイグレーションスクリプトに変換
  • 新人 / 引き継ぎ時の 仕様書代わり

MySQL / MariaDB

-- 単一テーブル
SHOW CREATE TABLE users;

-- 結果例
/*
CREATE TABLE `users` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `users_email_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
*/

-- 結果を 1 列で取得(コピペしやすい)
SHOW CREATE TABLE users \G

シェルから DB 全テーブルの定義を取得:

# mysqldump で定義のみ (-d = no data)
mysqldump -u root -p -d mydb > mydb_schema.sql

# 特定テーブルだけ
mysqldump -u root -p -d mydb users orders > tables.sql

# 1 行クエリで取り出し
mysql -u root -p -e "SHOW CREATE TABLE mydb.users\G"

# 全テーブル一括(シェルでループ)
for t in $(mysql -u root -p -N -e "SHOW TABLES FROM mydb"); do
  mysql -u root -p -e "SHOW CREATE TABLE mydb.$t\G"
done > all_schemas.sql

PostgreSQL

PostgreSQL は SHOW CREATE TABLE 相当の SQL がありません。代わりに:

# pg_dump で定義のみ (-s = schema only)
pg_dump -h localhost -U postgres -s -t users mydb > users.sql

# 全テーブル
pg_dump -s mydb > mydb_schema.sql

# 特定スキーマのみ
pg_dump -s -n public mydb > public_schema.sql

# データ込み(参考)
pg_dump mydb > mydb_full.sql
-- psql から定義を擬似確認(CREATE TABLE そのものではない)
\d+ users

-- カラム情報のみ
SELECT  column_name, data_type, is_nullable, column_default
FROM    information_schema.columns
WHERE   table_schema = 'public' AND table_name = 'users'
ORDER BY ordinal_position;

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

SQL Server

SSMS (SQL Server Management Studio) からが最も簡単:

  1. 左ペインでテーブルを右クリック
  2. Script Table As → CREATE To → New Query Editor Window
  3. CREATE TABLE 文が新しいクエリウィンドウに展開される

T-SQL で取り出す場合:

-- カラム情報
SELECT  c.name      AS column_name,
        t.name      AS data_type,
        c.max_length,
        c.is_nullable,
        dc.definition AS default_value
FROM    sys.columns c
JOIN    sys.types t ON c.user_type_id = t.user_type_id
LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
WHERE   c.object_id = OBJECT_ID('dbo.users')
ORDER BY c.column_id;

-- sp_help でテーブル情報
EXEC sp_help 'dbo.users';

-- インデックス
EXEC sp_helpindex 'dbo.users';

コマンドラインからは sqlpackage.exe で DACPAC をエクスポートし、その中の SQL を取り出す方法もあります。

SQLite

-- sqlite3 シェルから
.schema users
-- → CREATE TABLE users (...);

-- 全テーブル
.schema

-- インデックスも含む
.fullschema

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

-- 全テーブル + インデックス
SELECT sql FROM sqlite_master WHERE sql IS NOT NULL ORDER BY type, name;
# dump コマンドで定義 + データ
sqlite3 mydb.db .dump > mydb_dump.sql

# 定義のみ
sqlite3 mydb.db .schema > mydb_schema.sql

GUI ツールでの操作

ツール操作
DBeaverテーブル右クリック → Generate SQL → DDL
phpMyAdminテーブル選択 → エクスポート → SQL → 「構造のみ」
pgAdminテーブル右クリック → Scripts → CREATE Script
MySQL Workbenchテーブル右クリック → Send to SQL Editor → Create Statement
SSMSテーブル右クリック → Script Table As → CREATE To → New Query
TablePlusテーブル右クリック → Copy DDL Statement

Laravel マイグレーションへの変換

既存 DB から Schema::create マイグレーションを自動生成するパッケージ:

# kitloong/laravel-migrations-generator
composer require --dev kitloong/laravel-migrations-generator

php artisan migrate:generate
# → database/migrations/ に各テーブルの create 文が生成

# 特定テーブルだけ
php artisan migrate:generate --tables="users,posts"

# 既存マイグレーション無視
php artisan migrate:generate --no-down

環境間で定義を同期する手順例

# 本番 → 開発(MySQL)

# 本番側
mysqldump -h prod-db -u dump_user -p -d prod_db > schema.sql

# 開発側
mysql -u root -p dev_db < schema.sql

# 差分だけ取りたい場合は専用ツール
# mysqldiff / percona-toolkit / liquibase / flyway diff

FAQ

Q: 出力された CREATE TABLE 文を別 DB エンジンで使える?
A: 完全な互換性はない。ENGINE=InnoDBAUTO_INCREMENT は MySQL 固有。エンジン間移植は SchemaSpy / dbschema 等の標準化ツール経由が安全。

Q: 大量のテーブルを一括で取り出したい
A: mysqldump -d / pg_dump -s が最速。GUI 経由よりコマンドラインのほうがバージョン管理に向く。

Q: 外部キー制約も含まれる?
A: SHOW CREATE TABLE / pg_dump -s はすべて含む。GUI ツールはチェックボックスで切替できることが多い。

編集
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文を生成する方法