SQL【Lesson8】ALTER TABLE文で既存テーブルの変更操作

SQL Server

SQL【Lesson7】では、CREATE TABLE文を使ってデータベースにテーブルを新しく作りました。

しかし、テーブルを作った後に気付くこともあります。

「さっきデータベースに反映させたテーブルだけど…、

アレも追加して、あの列を変更して…。

また設計を変更したいけど、どうしよう。」

こんなこと、最初の内はあると思います。

本来は、将来性も考慮した設計を考えてからデータベースを作成します。
それでも、どうしても変更しなければならないときはALTER TABLE文を使います。

今回のSQL【Lesson8】ではALTER TABLE文を使って、テーブルの内容(設計)を変更操作します。

テーブルの変更操作(SQL:ALTER TABLE)

今回もSSMSのGUIを使わず、SQL文(ALTER TABLE)でテーブルの変更操作を行います。
この変更操作とは、作成されているデータの再定義のことです。
登録した定義をもう一度やり直せるのは便利なのですが、気をつける点もあります。

<ALTER TABLEで定義するまえに>
前提として、データベース設計は設計段階から将来的に広がる部分も含めて設計
することが鉄則です。ALTER TABLE文は、その設計されたテーブル構造の大幅な
変更が可能です。その構造変更がきっかけで、データベースを使ったアプリケー
ションが動かなくなる可能性があります。
ALTER TABLE文でデータ変更する際は、
設計状況をよく確認した上で使うようにしましょう。

列を追加する

SQL【Lesson7】で作ったT_在庫テーブルを使って、変更操作を行います。

以下の構文を参考に、T_在庫テーブルに販売管理ID列を追加定義します。

ALTER TABLE テーブル名 ADD 列名 型

  • データベース名[TOYONA自動車工業]の、T_在庫テーブルのCOLUMN(列)の確認です。
    在庫ID,車ID,個体NO、三つの列を持つテーブル構成です。
    ここに、販売管理ID列を追加します。
ALTER_TABLE_列の追加前
ALTER_TABLE_列の追加前
  • T_在庫テーブルに、列名が販売管理IDで、型がnvarchar(10)の列を追加するクエリです。
  • クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました]の通知が出ます。エラー通知が出た場合は、クエリを見直してみましょう。
ALTER-TABLE_列の追加クエリ実行
ALTER-TABLE_列の追加_クエリ実行
  • クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の情報に更新(F5)して、T_在庫テーブルの列の情報を確認してみましょう。

    受注管理ID列が作られ、型がnvachar(10)NULL許容で定義されていることが分かります。
ALTER-TABLE_列の追加確認
ALTER-TABLE_列の追加_反映確認

列の型を変更する

以下の構文を参考に、T_在庫テーブルの販売管理ID列の型を新しく定義変更します。

ALTER TABLE テーブル名 ALTER COLUMN 列名 新しく登録する型

  • 販売管理ID列のnvarchar(10)で定義されている型を、intに定義して変更します。
    それと、NULL許容だったのをNOT NULLで定義して、NULLを許容しないように一緒のクエリで変更をします。
  • クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました。]の通知が出ます。

    エラーの場合は、再度クエリを見直してみましょう。
ALTER-TABLE_型の変更クエリ実行
ALTER-TABLE_型の変更_クエリ実行
  • クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の状態に更新(F5)して、T_在庫テーブルの販売管理ID列の情報を確認してみましょう。

    型はintで、NULL以外の列定義に変更されていることが確認できます。
ALTER-TABLE_型の変更_反映確認
ALTER-TABLE_型の変更_反映確認

制約(FOREIGN KEY)を追加する

以下の構文を参考に、T_在庫テーブルの販売管理ID列と、T_販売管理テーブルの販売管理ID(主キー)のFPREIGN KEY(外部キー)制約を追加定義します。

ALTER TABLE テーブル名 ADD CONSTRAINT 制約名
FOREIGN KEY
(列名) REFERENCES 親テーブル名

  • 親テーブルはT_販売管理テーブルで、制約名はFK_T_在庫_T_販売管理です。
  • クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました。]の通知が出ます。
    エラーの場合は、再度クエリを見直してみましょう。
ALTER-TABLE_制約追加
ALTER-TABLE_制約追加_クエリ実行
  • クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の状態に更新(F5)して、T_在庫テーブルの[キー]の情報を確認してみましょう。

    FK_T_在庫_T_販売管理の制約名でFOREIGN KEY(外部キー)制約が定義されていることが分かります。
ALTER-TABLE_制約追加_反映確認
ALTER-TABLE_制約追加_反映確認

制約(FOREIGN KEY)を削除する

FOREIGN KEY(外部キー)制約を削除する前に注意する以下のポイントがあります。

<制約を削除する前に>
FOREIGN KEY制約で他のテーブルから参照されている場合、その列は削除できません。
削除すると、参照元との制約違反によりデータの整合性が保てなくなります。
FOREIGN KEY制約を定義した意図を考えてから削除しましょう。

以下の構文を参考に、上記で追加したT_在庫テーブルとT_受注管理テーブルのFPREIGN KEY(外部キー)制約を削除します。制約名はFK_T_在庫_T_販売管理です。

ALTER TABLE テーブル名 DROP CONSTRAINT 制約名

  • クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました。]の通知が出ます。
    エラーの場合は、再度クエリを見直してみましょう。
ALTER-TABLE_制約削除
ALTER-TABLE_制約削除_クエリ実行
  • クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の情報に更新(F5)して、T_在庫テーブルの[キー]の情報を確認してみましょう。

    制約名が、FK_T_在庫_T_販売管理のFOREIGN KEY(外部キー)制約が削除されていることが確認できます。
ALTER-TABLE_制約削除_反映確認
ALTER-TABLE_制約削除_反映確認

列を削除する

以下の構文を参考に、T_在庫テーブルの販売管理ID列を削除します。

ALTER TABLE テーブル名 DROP COLUMN 列名

  • クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました。]の通知が出ます。
    エラーの場合は、再度クエリを見直してみましょう。
ALTER-TABLE_列削除
ALTER-TABLE_列削除_クエリ実行
  • クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の情報に更新(F5)して、T_在庫テーブルの[列]の情報を確認してみましょう。

    販売管理ID(int、NULL以外)の列が削除されたことが確認できます。
ALTER-TABLE_列削除_反映確認
ALTER-TABLE_列削除_反映確認

以上が、既存テーブルを変更操作するときに使うALTER TABLE文でした。

ALTER TABLE文は気軽に使いたいところですが、データベース設計を破壊しかねないSQL文です。
しっかりと設計を考えてから使いましょう。

今回のALTER TABLE文ではテーブルの内容は変更できますが、テーブルそのものを削除することはできません。
次回は違う構文「DROP TABLE」を使って、テーブル削除を行います。


SQL【Lesson9】DROP TABLE文でテーブル削除へつづく。


コメント

タイトルとURLをコピーしました