対象: Oracle Database 19cの通常表のMODIFY。型変更の許可条件、DEFAULT、NOT NULL、依存を別々に確認します。MySQLの全属性再記述とOracleの省略属性保持を混同しないための製品比較も残しています。
| この記事の要点 |
|
カラム定義変更とは
既存テーブルのカラムのデータ型 / 桁数 / NULL 許可 / デフォルト値などを変更したいときに使う SQL です。テーブル設計が後から変わったとき、データ移行や仕様変更に伴って利用します。
DB ごとの構文の違い
| DB | 構文 |
|---|---|
| Oracle | ALTER TABLE 表名 MODIFY (カラム名 データ型 [制約]); |
| MySQL | ALTER TABLE 表名 MODIFY COLUMN カラム名 データ型 [制約]; |
| PostgreSQL | ALTER TABLE 表名 ALTER COLUMN カラム名 TYPE データ型; |
| SQL Server | ALTER TABLE 表名 ALTER COLUMN カラム名 データ型 [制約]; |
Oracle の例
Oracle 19cの独立した4文の教材です。現定義・非NULL値・長さ意味・依存が未確認で順番の成功を保証しません。NOT NULLの文は解除例ではなく既存NULLがあれば拒否されます。DEFAULT unknownは既存NULLを埋めず、業務値の推奨でもありません。MODIFYで省略した型・DEFAULT・制約は保持されます。通常DDLの暗黙COMMITに注意。実Oracle未実行です。
-- データ型 / 桁数の変更
ALTER TABLE test_table MODIFY (col1 VARCHAR2(20));
-- NULL 許可 / NOT NULL の切り替え
ALTER TABLE test_table MODIFY (col1 VARCHAR2(20) NOT NULL);
-- デフォルト値の変更
ALTER TABLE test_table MODIFY (col1 DEFAULT 'unknown');
-- 複数カラムを一括変更
ALTER TABLE test_table MODIFY (
col1 VARCHAR2(20) NOT NULL,
col2 NUMBER(8,2)
);
MySQL の例
MySQL 8.4のMODIFY/CHANGE比較例です。Oracleの省略属性保持とは異なり、型と残したい全属性を再記述します(PRIMARY KEY/UNIQUE等の索引属性は別)。省略したUNSIGNED・DEFAULT・COMMENT等は引き継がれません。NULL属性・文字集合/照合順序も現定義と照合します。CHANGEの改名は利用側互換を保証せず、型変換で切詰めも起こり得ます。SQL mode緩和で通さないでください。実DB未実行です。
-- 型と桁数を変更
ALTER TABLE users MODIFY COLUMN nickname VARCHAR(64) NOT NULL;
-- リネームを伴う変更(CHANGE COLUMN)
ALTER TABLE users CHANGE COLUMN nickname display_name VARCHAR(64) NOT NULL;
PostgreSQL の例
PostgreSQLのUSING / NOT NULL / DEFAULTを比較する独立文です。Oracle構文ではありません。旧DROP NOT NULLは制約を解除し、DROP DEFAULTは将来の省略値を変えます。エラー回避の推奨や順次実行する手順ではなく、保護とwriterへの影響を先に確認します。実DB未実行です。
-- 型変更
ALTER TABLE users ALTER COLUMN age TYPE BIGINT USING age::BIGINT;
-- NOT NULL の追加 / 解除
ALTER TABLE users ALTER COLUMN email SET NOT NULL;
ALTER TABLE users ALTER COLUMN email DROP NOT NULL;
-- DEFAULT の追加 / 解除
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active';
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;
SQL Server の例
SQL Server Database Engineの独立例です。Usersの既存型・NULL・既定値制約の有無と依存を確認します。DEFAULT制約追加は既存NULLを埋める保証ではなく、OracleのDEFAULT指定とは別です。Oracle用へ転用せず一括実行しないでください。実DB未実行です。
-- 型変更
ALTER TABLE Users ALTER COLUMN Nickname NVARCHAR(64) NOT NULL;
-- DEFAULT は制約として別途追加
ALTER TABLE Users ADD CONSTRAINT DF_Users_Status DEFAULT('active') FOR Status;
注意点
- 桁数の縮小: Oracleは新しい長さに収まらない既存値があれば拒否する。MySQLは型変換・切詰めや警告/エラーがSQL modeにも依存する。既存設定と実データを先に確認し、不明なら中止。SQL modeの緩和で通さない
- 型変更: Oracleでは全行NULLの場合の型変更と、非NULL値がある列の許可条件を分ける。文字/RAW長の拡張や数値精度の拡大、実値が収まる縮小などは型と依存の条件を照合する。NUMBERからVARCHAR2等を暗黙キャスト可否だけで判断せず、値をNULLへ消して通さない。USINGはPostgreSQLの機能でOracleへ付け足す構文ではない
- NOT NULL 追加: Oracleの既存列の通常DEFAULT変更は既存NULLを埋めない。DEFAULT ON NULLは別指定で、通常DEFAULTと同一ではない。既存値の業務上の意味・全writer・残存NULLを確認し、unknown/activeへの一律UPDATEや制約解除でエラーを回避しない
- テーブルロック / 再構築: 対象の製品・版・変更内容で待機/再構築を確認する。MySQL向けpt-online-schema-change / gh-ostをOracleのMODIFY用に転用しない。onlineでもmetadata lockや切替があり無停止保証ではない
- 主キーや外部キー、索引・ビュー・アプリの依存も照合する。参照側を機械的に変更したり保護を解除して実行を通すのではなく、変更しない選択も含めて整合性を評価する
関連 SQL
| 操作 | SQL |
|---|---|
| カラム追加 | ALTER TABLE 表 ADD (カラム データ型); |
| カラム削除 | ALTER TABLE 表 DROP COLUMN カラム; |
| カラム名変更 | ALTER TABLE 表 RENAME COLUMN 旧 TO 新; |
| テーブル名変更 | ALTER TABLE 旧 RENAME TO 新; |
関連記事
Oracle 19cの確定境界と実行前の確認
通常表のDDLは構文上有効なDDLの実行前と成功後に暗黙COMMITがあります。DDLが失敗しても先行DMLが確定するため、後からROLLBACKすればUPDATEまで戻るとは保証しません。ALTER TABLEを通常の利用者ROLLBACKで取り消すことはできません。実行前に未確定DMLを分離し、接続先・所有schema・実名・現定義・対象行と復旧方法を確認します。
一時表を一括して例外にしません。transaction-specific private temporary tableのON COMMIT DROP DEFINITIONによる作成は既存transactionを暗黙COMMITしませんが、session-specificのPRESERVE DEFINITIONによる作成は暗黙COMMITします。これは作成時の限定条件で、通常表のADD/MODIFYを可逆にする仕組みではありません。
変更前後で型・長さのBYTE/CHAR意味・精度・NULL・DEFAULT・コメント・文字集合/照合順序・索引/制約と既存値を照合します。旧アプリ・バッチ・複数writerのNULL再流入も確認し、既存NULLを一律unknown/activeに置換したり、保護の解除・SQL mode変更・列DROPへ誘導しません。
MySQL向け外部ツールも読取診断とは限りません。pt-online-schema-changeは外部キーに特別な処理と追加リスクがあり、--dry-runでも新表を作成・変更します。gh-ostは外部キー制約とtriggerを非対応としています。制限を避けるために外部キーを外したり検査を無効化する手順ではありません。MySQL online DDLでもmetadata lock待ちと最終段階の排他取得があり、無停止の保証ではありません。
確認資料と検証範囲
2026-10-27に公式一次資料を確認しました。Oracle実機では未実行です。他製品の旧SQL、ロック、並行writer、backfill、性能、復旧、外部ツールも実測していません。保持したSQLは実行済みの手順ではなく、静的な本文・HTML・履歴ガード検査は実DBの成功保証とは別です。
- Oracle 19c ALTER TABLE: ADD / DEFAULT / ON NULL / modify_col_properties
- Oracle 19c COMMIT: DDL前と成功後の確定
- Oracle 19c CREATE TABLE: private temporary tableの限定例外
- Oracle 19c Data Types: VARCHAR2と長さ意味
- MySQL 8.4 ALTER TABLE: ADD / MODIFY / CHANGEと省略属性
- MySQL 8.4 Online DDL Limitations
- PostgreSQL 18 Modifying Tables: 定数DEFAULTとvolatile式
- Percona pt-online-schema-change: 外部キー / --dry-run
- gh-ost公式: Requirements and limitations
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09