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列を追加します。
- T_在庫テーブルに、列名が販売管理IDで、型がnvarchar(10)の列を追加するクエリです。
- クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました]の通知が出ます。エラー通知が出た場合は、クエリを見直してみましょう。
- クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の情報に更新(F5)して、T_在庫テーブルの列の情報を確認してみましょう。
受注管理ID列が作られ、型がnvachar(10)、NULL許容で定義されていることが分かります。
列の型を変更する
以下の構文を参考に、T_在庫テーブルの販売管理ID列の型を新しく定義変更します。
ALTER TABLE テーブル名 ALTER COLUMN 列名 新しく登録する型
- 販売管理ID列のnvarchar(10)で定義されている型を、intに定義して変更します。
それと、NULL許容だったのをNOT NULLで定義して、NULLを許容しないように一緒のクエリで変更をします。 - クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました。]の通知が出ます。
エラーの場合は、再度クエリを見直してみましょう。
- クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の状態に更新(F5)して、T_在庫テーブルの販売管理ID列の情報を確認してみましょう。
型はintで、NULL以外の列定義に変更されていることが確認できます。
制約(FOREIGN KEY)を追加する
以下の構文を参考に、T_在庫テーブルの販売管理ID列と、T_販売管理テーブルの販売管理ID(主キー)のFPREIGN KEY(外部キー)制約を追加定義します。
ALTER TABLE テーブル名 ADD CONSTRAINT 制約名
FOREIGN KEY(列名) REFERENCES 親テーブル名
- 親テーブルはT_販売管理テーブルで、制約名はFK_T_在庫_T_販売管理です。
- クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました。]の通知が出ます。
エラーの場合は、再度クエリを見直してみましょう。
- クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の状態に更新(F5)して、T_在庫テーブルの[キー]の情報を確認してみましょう。
FK_T_在庫_T_販売管理の制約名でFOREIGN KEY(外部キー)制約が定義されていることが分かります。
制約(FOREIGN KEY)を削除する
FOREIGN KEY(外部キー)制約を削除する前に注意する以下のポイントがあります。
<制約を削除する前に>
FOREIGN KEY制約で他のテーブルから参照されている場合、その列は削除できません。
削除すると、参照元との制約違反によりデータの整合性が保てなくなります。
FOREIGN KEY制約を定義した意図を考えてから削除しましょう。
以下の構文を参考に、上記で追加したT_在庫テーブルとT_受注管理テーブルのFPREIGN KEY(外部キー)制約を削除します。制約名はFK_T_在庫_T_販売管理です。
ALTER TABLE テーブル名 DROP CONSTRAINT 制約名
- クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました。]の通知が出ます。
エラーの場合は、再度クエリを見直してみましょう。
- クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の情報に更新(F5)して、T_在庫テーブルの[キー]の情報を確認してみましょう。
制約名が、FK_T_在庫_T_販売管理のFOREIGN KEY(外部キー)制約が削除されていることが確認できます。
列を削除する
以下の構文を参考に、T_在庫テーブルの販売管理ID列を削除します。
ALTER TABLE テーブル名 DROP COLUMN 列名
- クエリが正しければ、実行(F5)するとメッセージ欄に[コマンドは正常に完了しました。]の通知が出ます。
エラーの場合は、再度クエリを見直してみましょう。
- クエリが正常に完了したことが確認できたら、オブジェクトエクスプローラーを最新の情報に更新(F5)して、T_在庫テーブルの[列]の情報を確認してみましょう。
販売管理ID(int、NULL以外)の列が削除されたことが確認できます。
以上が、既存テーブルを変更操作するときに使うALTER TABLE文でした。
ALTER TABLE文は気軽に使いたいところですが、データベース設計を破壊しかねないSQL文です。
しっかりと設計を考えてから使いましょう。
今回のALTER TABLE文ではテーブルの内容は変更できますが、テーブルそのものを削除することはできません。
次回は違う構文「DROP TABLE」を使って、テーブル削除を行います。
SQL【Lesson9】DROP TABLE文でテーブル削除へつづく。
コメント