◀ 3.

Oracle 19cの列定義変更|MODIFYの型・属性保持と既存NULL

▶

対象: Oracle Database 19cの通常表のMODIFY。型変更の許可条件、DEFAULT、NOT NULL、依存を別々に確認します。MySQLの全属性再記述とOracleの省略属性保持を混同しないための製品比較も残しています。

OracleとMySQLで異なる列属性省略と既存値の確認
変更する属性と残す属性、既存値と将来の省略値を分離。図は概念説明で、実DDLの実行結果ではありません。
この記事の要点
  • 既存テーブルのカラムを変更するには ALTER TABLE 文を使う — データ型 / NULL 許可 / 既定値などを変更可能
  • Oracle: MODIFY (列 データ型 [制約])。MySQL: MODIFY COLUMN 列 データ型 [属性]。括弧構文を共通化しない
  • PostgreSQL / SQL Server: ALTER TABLE 表名 ALTER COLUMN カラム名 ...
  • 桁数を縮める / 型を変える場合は既存データとの互換性に注意(縮小不可・暗黙キャスト失敗)
  • 本番ではテーブルロック / 再構築が発生することがあるため、変更時間とサービス影響を事前に評価

カラム定義変更とは

既存テーブルのカラムのデータ型 / 桁数 / NULL 許可 / デフォルト値などを変更したいときに使う SQL です。テーブル設計が後から変わったとき、データ移行や仕様変更に伴って利用します。

DB ごとの構文の違い

DB構文
OracleALTER TABLE 表名 MODIFY (カラム名 データ型 [制約]);
MySQLALTER TABLE 表名 MODIFY COLUMN カラム名 データ型 [制約];
PostgreSQLALTER TABLE 表名 ALTER COLUMN カラム名 TYPE データ型;
SQL ServerALTER 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の成功保証とは別です。

子ページ

子ページはありません

同階層のページ
  1. 表の作成
  2. カラムの追加
  3. カラムの定義変更
  4. カラムの削除
  5. 表の削除
  6. TRUNCATE文

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