◀ 3.

MySQL/MariaDBのテーブル関連|子ページとDDL前の確認

▶

本稿は MariaDB / MySQL のテーブル関連 SQL に関する記事です。テーブルの作成・確認・変更・削除・インデックス・外部キーといった、テーブルレベルの操作をまとめます。

子ページから項目を選択してください。

本ページの子ページ

作成・変更の前に、定義と利用側を確認する

定義と保持情報、利用側とロックを順に確認する図

この9本が本ページの実際の子ページです。新しい表なら「テーブル作成」、型/NULL/既定値等なら「カラムの定義変更」、名前だけなら「カラム名の変更」へ進みます。インデックスや外部キー、AUTO_INCREMENTはそれぞれの子ページで別に確認してください。以降の早見表を上から順に実行する必要はありません。

最初は読取だけで対象を確かめる

SELECT VERSION() AS server_version, DATABASE() AS selected_database,
       @@SESSION.sql_mode AS session_sql_mode, @@SESSION.time_zone AS session_time_zone;

接続先の製品/版、現在のDB、セッションのstrictモード等を読みます。DATABASE()がNULLなら既定DBが未選択です。アプリの接続先と同じサーバー/DBを見ているかを確認し、表示エラーを消すためのCREATE/ALTERへ進みません。実際の内部名やログの全文は公開しないでください。

対象表ではSHOW CREATE TABLEと列の属性を読み、DDL後に保持したい型・符号・NULL・既定値・コメント・charset/collationを記録します。列一覧だけでは、外部キー、索引、生成式、trigger/view、利用側の旧SQLまで点検したことにはなりません。定義出力にも業務上の情報があるため、必要な部分だけ扱います。

DDLの成功、データ保持、サービスの継続は別

MySQL/MariaDBの通常のCREATE/ALTER等は、アプリのDMLと同じROLLBACKで取り消せるとは限りません。検体でCREATE後にROLLBACKしても表は残りました。atomic DDLという実装上の説明と、利用者が任意の変更を取り消せることを混同しません。バックアップの取得だけでなく、戻す対象/復元方法/利用側の互換性も計画します。

INSTANTやLOCK=NONEでも、metadata lockや切替の待ちは別にあります。検体では同じINSTANTのADDが、別接続の未終了transactionで1205となり、transaction終了後に成功しました。「数ミリ秒」「ロックなし」「停止時間ゼロ」という一律の約束にはできません。

型や制約の名前だけで同一視しない

BOOLEANはMySQL/MariaDBでTINYINTの別名ですが、0/1以外の値を禁止する制約ではありません。検体では2を保存できました。JSONもMySQLの型とMariaDBのLONGTEXT系aliasで表現が異なります。同じSQLの見た目から格納形式や全関数・replicationの互換性まで保証しません。

整数の符号/幅、文字列の文字数とbyte、日時の小数秒精度/時刻範囲/タイムゾーン変換も別に確認します。たとえばTIMESTAMPの2038年上限をMariaDB全版へ一般化できません。MySQL8.4.13検体は2040年を拒否し、MariaDB11.8.9検体はUTC条件で保存できました。

オンライン変更ツールは別途の設計が必要

pt-online-schema-change/gh-ostを導入すれば自動的に安全になるわけではありません。対応製品/版、主キー等、外部キー/trigger、binlog、負荷/遅延、切替ロックと失敗時の残存物を確認します。rootや秘密値をコマンド行へ直書きする旧例をそのまま利用しません。

とくにpt-online-schema-changeのdry-runも新表の作成/ALTERを伴い、完全な読取専用ではありません。両ツールの実行・導入は今回していません。既存のDDLやデータへ接続して試さず、必要なら別の承認済み検証計画で扱います。

テーブル関連 SQL の早見表

旧例の注意:操作比較の表です。DROP/TRUNCATEやカラム変更を順次実行しません。読み取りとDDLを分け、ALTERは残す全属性を調べます。

操作SQL
一覧表示SHOW TABLES;
定義の確認SHOW CREATE TABLE t; / DESC t;
テーブル作成CREATE TABLE t ( ... ) ENGINE=InnoDB CHARSET=utf8mb4;
削除DROP TABLE t;
名前変更RENAME TABLE old TO new;
全行削除(DDL。無条件の速度保証ではない)TRUNCATE TABLE t;
カラム追加ALTER TABLE t ADD COLUMN c INT NOT NULL;
カラム型変更ALTER TABLE t MODIFY c BIGINT NOT NULL;
カラム名変更ALTER TABLE t CHANGE old new INT;
インデックス追加CREATE INDEX idx_t_c ON t(c);
外部キー追加ALTER TABLE t ADD CONSTRAINT fk_x FOREIGN KEY (a) REFERENCES s(id);

典型的なテーブル作成

旧例の注意:元のusers作成例を保持したものです。既存表へ実行せず、照合順序/一意性/名前を実要件へ合わせます。

CREATE TABLE users (
  id         BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  name       VARCHAR(100) NOT NULL,
  email      VARCHAR(255) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted_at TIMESTAMP NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uk_email (email),
  KEY idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

主なデータ型

旧例の注意:型の用途の概要です。BOOLEAN/JSON/日時/格納範囲は製品/版ごとに確認します。

分類主な型用途
整数TINYINT / SMALLINT / INT / BIGINT必要桁に応じて選択
小数DECIMAL(p,s) / FLOAT / DOUBLE金額は DECIMAL
文字列CHAR(n) / VARCHAR(n) / TEXT長さに応じて
日時DATE / DATETIME / TIMESTAMPTZ を意識
論理値TINYINT(1) / BOOLEAN0/1用途の型alias。2等を禁止するCHECKではない
JSONJSON製品ごとの格納/検証/関数を確認。MariaDBはLONGTEXT系alias
列挙ENUM('a','b')軽量だが拡張性に難
バイナリBLOB / VARBINARY画像・ファイル

キー / 制約

旧例の注意:DEFAULT/AUTO_INCREMENTは全てが同じ種類の制約という意味ではありません。CHECKやFKの版/engine対応も確認します。

制約用途
PRIMARY KEY主キー (NULL 不可・一意)
UNIQUE一意制約
NOT NULLNULL 禁止
DEFAULT 値既定値
FOREIGN KEY外部キー
CHECK条件式 (MySQL 8.0.16+ で本格対応)
AUTO_INCREMENT自動採番

大きなテーブルへの ALTER の注意

  • 大規模テーブルへの ALTER TABLE は長時間ロックすることがある
  • MySQL 5.6+ ではオンライン DDL がサポートされるが、操作内容によりロック・コピーが発生
  • 外部ツールは製品/版/FK/trigger/binlog等の要件と切替リスクを確認。標準の本番必須手順にはしない
  • レプリカ遅延に影響するので、夜間帯やメンテ時間に実施
  • 必ず事前バックアップとリハーサルを行う

注意点

  • InnoDB を選ぶ (トランザクション・行ロック・外部キー)。MyISAM は新規利用を避ける
  • 文字コードは utf8mb4。utf8というaliasの対応先は製品/版/設定を確認。utf8mb3は4byte文字に対応しない
  • カラム名・テーブル名は小文字・スネークケースで統一すると OS 間移植時の混乱を避けられる
  • 巨大な TEXT/BLOB はテーブル本体を肥大化させる。S3 等の外部ストレージ+ URL 保存の検討
  • DROP TABLE / TRUNCATE はロールバック不可。事前バックアップを徹底

関連

確認範囲と関連ページ

2026年10月26日確認。新12SQLを新規tmpfs MySQL8.4.13/MariaDB11.8.9-ubu2404で実行し各15/計30試験に成功。既存表/複製、列の属性/値、strictな縮小とNULL拒否、名前変更とview/索引、DEFAULT、metadata lock待ち、型/日時の製品差と外部キーを検査しました。本番schema/データ/設定/利用側の移行はしていません。既存のvendor/依存を変更せず、Laravelのmigrate/外部オンライン変更ツール、他DB製品の旧全SQL、全型/照合順序/依存/巨大負荷・無停止や完全復旧を実行保証するものではありません。新図は900/360px静止画で確認し、Work設定でブラウザ無効のため実ブラウザ/実端末は未検証です。

テーブル関連の親ページから子ページを選択できます。テーブル作成、カラム定義変更、カラム名変更、追加/削除、外部キー、製品配下のSQL、MySQL/MariaDBも参照します。

一次資料:MySQL ALTERの属性と依存、MariaDB ALTER、MySQL LIKE、MySQL SELECTでの作成、Online DDLとmetadata lock、操作別のOnline DDL、MySQLの格納容量、MariaDB TIMESTAMPの版別範囲、MariaDB JSON、SQL Serverの列名変更、PostgreSQL ALTER、Laravel13の列変更、Laravel10.x公式文書の旧DB条件、pt-online-schema-changeの動作とdry-run、gh-ostの要件/制約。

子ページ
  1. テーブル作成
  2. カラムの定義変更
  3. カラム名の変更
  4. カラム追加 / 削除
  5. インデックスの作成
  6. インデックスの削除
  7. AUTO_INCREMENTの仕様について
  8. AUTO_INCREMENTの追加と確認方法
  9. 外部キーの追加/削除と制約名の確認方法
同階層のページ
  1. 基本構文
  2. データベース関連
  3. テーブル関連
  4. ユーザー関連
  5. メタデータ関連
  6. NULL判定を伴うCASE文の使用方法

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