SQLでテーブルを作成したあとに、「列を追加したい」「列のデータ型を変更したい」「不要な列を削除したい」と思う場面があります。

そのようなときに使用するのが、ALTER TABLE文です。

ALTER TABLEを使うと、既存のテーブルを作り直さずに、テーブル構造を変更できます。

この記事では、SQL Server Management Studio、いわゆるSSMSを使って、テーブル作成からALTER TABLEの実行、変更結果の確認までを順番に解説します。

SQL初心者の方でも実際に手を動かして確認できるように、SQL文は省略せずに掲載しています。

この記事でわかること

この記事では、SSMSを使ってALTERの基本操作を学びます。

  • SQL Server LocalDBへSSMSで接続する方法
  • ALTER TABLEでできること
  • テーブルに列を追加する方法
  • 既存列のデータ型やNULL許可を変更する方法
  • 不要な列を削除する方法
  • テーブル構造の変更結果を確認する方法
  • ALTER実行時によくあるエラーと注意点

動作環境

この記事では、Windows環境でSQL Server LocalDBとSSMSを使う前提で進めます。

バージョンは一例です。環境によって画面表示や細かい操作が異なる場合があります。

項目内容
OSWindows 11
SQL ServerSQL Server LocalDB
管理ツールSQL Server Management Studio(SSMS)
接続先(LocalDB)\MSSQLLocalDB
使用言語SQL

環境構築ができていない場合は、以下を参考にしてください。
また、C#.NETで実行したい方は本記事と以下の記事を見ながら試行してみてください。

完成イメージ

この記事の最終的なゴールは、SSMSでSQLを実行し、既存テーブルの列を追加・変更・削除できる状態になることです。

具体的には、以下の流れで確認します。

  1. サンプル用のデータベースを作成する
  2. Customersテーブルを作成する
  3. テストデータを登録する
  4. ALTER TABLEで列を追加する
  5. ALTER TABLEで列の定義を変更する
  6. ALTER TABLEで列を削除する
  7. SELECT文とSSMSのオブジェクトエクスプローラーで結果を確認する

最初は、以下のようなCustomersテーブルを作成します。

CustomerIdCustomerNameEmail
1山田太郎yamada@example.com
2佐藤花子sato@example.com

その後、ALTER TABLEを使って、PhoneNumber列やCreatedAt列を追加し、列の定義変更や削除も確認します。

ALTERの実践

ここからは、SSMSを使用して実際にALTERの動きを確認します。

作業は上から順番に進めれば確認できるようにしています。

学習用データベースを作成する

次に、ALTER TABLEを試すためのデータベースを作成します。

今回は、AlterSampleDBという名前のデータベースを作成します。

SSMSで新しいクエリを開き、以下のSQLを実行します。

CREATE DATABASE AlterSampleDB;

実行後、左側のデータベース一覧を更新すると、AlterSampleDBが表示されます。

AlterSampleDBが表示されていれば、データベース作成は完了です。

使用するデータベースを指定する

データベースを作成しただけでは、まだ作業対象として選択されていません。

次に、どのデータベースに対してSQLを実行するかを指定します。

以下のSQLを実行してください。

USE AlterSampleDB;

これで、以降のSQLはAlterSampleDBに対して実行されます。

SSMS上部のデータベース選択欄がAlterSampleDBになっていることも確認しておくと安心です。

Customersテーブルを作成する

次に、ALTER TABLEを試すためのCustomersテーブルを作成します。

ここでは、顧客情報を管理するシンプルなテーブルを作成します。

CREATE TABLE Customers
(
    CustomerId INT IDENTITY(1,1) PRIMARY KEY,
    CustomerName NVARCHAR(50) NOT NULL,
    Email NVARCHAR(100) NULL
);

各列の意味は以下の通りです。

列名データ型内容
CustomerIdINT顧客ID
CustomerNameNVARCHAR(50)顧客名
EmailNVARCHAR(100)メールアドレス

CustomerIdにはIDENTITYを指定しています。IDENTITYを指定すると、データを追加したときに番号が自動で採番されます。

サンプルデータを登録する

テーブル構造の変更を確認しやすくするため、サンプルデータを登録します。

今回は2件だけ登録します。ALTER実行前の状態を確認するためのデータとして使います。

INSERT INTO Customers
(
    CustomerName,
    Email
)
VALUES
(
    N'山田太郎',
    N'yamada@example.com'
),
(
    N'佐藤花子',
    N'sato@example.com'
);

実行すると以下のようなメッセージが表示されます。

登録できたか確認するために、以下のSELECT文を実行します。

SELECT
    CustomerId,
    CustomerName,
    Email
FROM
    Customers;

以下のような結果が表示されれば問題ありません。

ALTER TABLEで列を追加する

ここからALTER TABLEを使います。
まずは、Customersテーブルに電話番号を管理するPhoneNumber列を追加します。

列を追加するときは、ALTER TABLE テーブル名 ADD 列名 データ型の形で書きます。

ALTER TABLE Customers
ADD PhoneNumber NVARCHAR(20) NULL;

実行できたら、SELECT文で確認します。

SELECT
    CustomerId,
    CustomerName,
    Email,
    PhoneNumber
FROM
    Customers;

PhoneNumber列が追加されていれば成功です。

既存データに対して追加した列の値は、今回はNULLになります。

DEFAULT付きで列を追加する

次に、作成日時を管理するCreatedAt列を追加します。
今回は、既存データにも値が入るように、DEFAULT制約を指定します。

ALTER TABLE Customers
ADD CreatedAt DATETIME NOT NULL
CONSTRAINT DF_Customers_CreatedAt DEFAULT GETDATE();

実行後、以下のSELECT文で確認します。

SELECT
    CustomerId,
    CustomerName,
    Email,
    PhoneNumber,
    CreatedAt
FROM
    Customers;

CreatedAt列に日時が入っていれば成功です。

DEFAULTを指定すると、新しくデータを追加したときにも初期値が自動で入ります。

ただし、既存データへの反映方法はSQL Serverのバージョンや指定内容によって異なる場合があります。

列のデータ型を変更する

次に、Email列の文字数を変更します。

現在はNVARCHAR(100)ですが、これをNVARCHAR(200)に変更します。

既存列を変更するときは、ALTER TABLE テーブル名 ALTER COLUMN 列名 新しい定義の形で書きます。

ALTER TABLE Customers
ALTER COLUMN Email NVARCHAR(200) NULL;

このSQLでは、Email列をNVARCHAR(200)に変更し、NULLを許可する設定にしています。

または、以下のSQLでも列情報を確認できます。

SELECT
    COLUMN_NAME,
    DATA_TYPE,
    CHARACTER_MAXIMUM_LENGTH,
    IS_NULLABLE
FROM
    INFORMATION_SCHEMA.COLUMNS
WHERE
    TABLE_NAME = 'Customers';

Email列のCHARACTER_MAXIMUM_LENGTHが200になっていれば成功です。

列名を変更する

SQL Serverでは、列名の変更にALTER TABLEではなく、sp_renameを使います。
ここでは、PhoneNumber列をTelに変更します。

列名変更は、既存のSQLやアプリ側の処理に影響しやすい操作です。

EXEC sp_rename
    'Customers.PhoneNumber',
    'Tel',
    'COLUMN';

実務では、変更前に参照箇所を確認してから実行してください。

変更後、以下のSQLで確認します。

SELECT
    CustomerId,
    CustomerName,
    Email,
    Tel,
    CreatedAt
FROM
    Customers;

PhoneNumberではなくTelとして表示されれば成功です。

ただし、列名を変更すると、変更前の列名を使っているSELECT文はエラーになります。

列を削除する

次に、Tel列を削除します。

列を削除するときは、ALTER TABLE テーブル名 DROP COLUMN 列名の形で書きます。

ALTER TABLE Customers
DROP COLUMN Tel;

実行後、以下のSQLで確認します。

SELECT
    CustomerId,
    CustomerName,
    Email,
    CreatedAt
FROM
    Customers;

Tel列が表示されなければ成功です。

列を削除すると、その列に入っていたデータも削除されます。
復元できない場合があるため、実務では事前にバックアップを取ってから実行してください。

制約がある列を削除する場合

DEFAULT制約などが付いている列は、そのまま削除できない場合があります。

たとえば、CreatedAt列にはDF_Customers_CreatedAtというDEFAULT制約を設定しました。

このような列を削除する場合は、先に制約を削除してから列を削除します。

ALTER TABLE Customers
DROP CONSTRAINT DF_Customers_CreatedAt;

ALTER TABLE Customers
DROP COLUMN CreatedAt;

実行後、以下のSQLで確認します。

SELECT
    CustomerId,
    CustomerName,
    Email
FROM
    Customers;

CreatedAt列が表示されなければ成功です。

制約名がわからない場合は、SSMSのオブジェクトエクスプローラーから確認するか、システムビューを使って確認します。

SELECT
    dc.name AS ConstraintName,
    t.name AS TableName,
    c.name AS ColumnName
FROM
    sys.default_constraints AS dc
INNER JOIN
    sys.tables AS t
ON
    dc.parent_object_id = t.object_id
INNER JOIN
    sys.columns AS c
ON
    dc.parent_object_id = c.object_id
    AND dc.parent_column_id = c.column_id
WHERE
    t.name = 'Customers';

制約名は環境や作成方法によって異なる場合があります。

そのため、実務では削除前に必ず確認してください。

最終的なテーブル状態を確認する

最後に、Customersテーブルの状態を確認します。

ALTER TABLEを複数回実行したあとは、想定した列構成になっているかを必ず確認しましょう。

SELECT
    COLUMN_NAME,
    DATA_TYPE,
    CHARACTER_MAXIMUM_LENGTH,
    IS_NULLABLE
FROM
    INFORMATION_SCHEMA.COLUMNS
WHERE
    TABLE_NAME = 'Customers'
ORDER BY
    ORDINAL_POSITION;

最終的には、以下のような列構成になります。

実際の表示内容は、SQL Serverの設定や環境によって異なる場合があります。

よくあるエラー・注意点

ALTER TABLEはテーブル構造を変更するSQLなので、実行前の確認が重要です。

特に実務では、既存データ・制約・参照しているSQLに影響する可能性があります。

エラー・注意点原因対処法
データベースが見つからないUSEで指定したデータベース名が間違っているオブジェクトエクスプローラーでデータベース名を確認する
テーブルが見つからないテーブル名の入力ミス、または違うデータベースを選択しているUSEで対象DBを指定し、テーブル名を確認する
列名が無効です変更前の列名をSELECT文で指定しているsp_rename後は新しい列名を使う
NOT NULL列の追加でエラー既存データに新しい列の値が入らないNULL許可で追加するか、DEFAULTを指定する
列を削除できないDEFAULT制約や外部キー制約が付いている先に制約を削除してから列を削除する
文字数を短く変更できない既存データが変更後の文字数を超えている先にデータを確認・修正してからALTERする
変更の保存が許可されていませんSSMSのテーブルデザイナーで保存しようとしているクエリウィンドウでALTER TABLEを実行する

ALTER TABLEはデータ操作ではなく構造変更

INSERT、UPDATE、DELETEはテーブル内のデータを操作するSQLです。

一方で、ALTER TABLEはテーブルの構造を変更するSQLです。

SQL主な役割
SELECTデータを取得する
INSERTデータを追加する
UPDATEデータを更新する
DELETEデータを削除する
ALTER TABLEテーブル構造を変更する

ALTER TABLEは影響が大きいため、SELECT文やUPDATE文より慎重に扱う必要があります。

列削除は元に戻せない場合がある

DROP COLUMNで列を削除すると、その列に入っていた値も削除されます。

SSMS上で見えなくなるだけではなく、列データそのものが削除される点に注意してください。

必要なデータがある場合は、削除前に別テーブルへ退避するなどの対応が必要です。

SELECT
    CustomerId,
    CustomerName,
    Email
INTO
    Customers_Backup
FROM
    Customers;

上記のSQLでは、Customersテーブルの一部データをCustomers_Backupテーブルとして退避しています。

実務では、正式なバックアップ手順に従って対応してください。

列名変更は参照先への影響が大きい

列名を変更すると、その列名を使っているSQL、ビュー、ストアドプロシージャ、アプリケーション側の処理に影響します。

そのため、sp_renameを使う場合は、変更前の列名を参照している箇所を先に洗い出す必要があります。

小規模な学習用データベースでは問題になりにくいですが、業務システムでは影響範囲が広くなることがあります。

まとめ

この記事では、SSMSを使ってSQL ServerのALTER TABLE文を実行する方法を解説しました。

ALTER TABLEを使うことで、既存テーブルの列追加・列変更・列削除ができます。

今回行った内容は以下の通りです。

  • SQL Server LocalDBへSSMSで接続した
  • サンプル用データベースを作成した
  • Customersテーブルを作成した
  • ALTER TABLE ADDで列を追加した
  • ALTER TABLE ALTER COLUMNで列定義を変更した
  • sp_renameで列名を変更した
  • ALTER TABLE DROP COLUMNで列を削除した
  • INFORMATION_SCHEMA.COLUMNSで列情報を確認した

次に学ぶなら、CREATE TABLE、INSERT、UPDATE、DELETE、SELECT文を組み合わせて、テーブル作成からデータ操作まで一通り確認するのがおすすめです。

特にALTER TABLEは、テーブル設計の見直しや機能追加でよく使うため、基本構文を押さえておくとSQLの理解が深まります。