【SQL Server】テーブルに新規に列を追加、削除する方法

すでに作成されているテーブルに対して新規に列を追加する方法です。

列を追加したい場合はALTER TABLEを使用して列をテーブルに追加します。

テーブルに列を新規で追加する場合

(1)構文

ALTER TABLE <対象テーブル名> ADD <追加したい列の列名> <データ型>;

ALTER TABLEの後ろに列を追加したい対象となるテーブル名を設定し、ADD句の後ろに追加したい列の列名と追加する列のデータ型を設定します。



(2)使用例
①「性別ID」列追加前の従業員テーブル(T_EMPLOYEE)

今回は従業員の情報を取り扱っているT_EMPLOYEEテーブルに新しく「性別ID」列(SEX_ID)を追加します。
f:id:rumr-Labo:20190604020639p:plain



②「性別ID」列追加SQL

--「性別ID」列追加SQL
ALTER TABLE T_EMPLOYEE ADD SEX_ID NVARCHAR(1);

「性別ID」列を追加するためのALTER TABLEのSQLです。



③「性別ID」列追加後の従業員テーブル(T_EMPLOYEE)

f:id:rumr-Labo:20190604021135p:plain

列を追加が完了するとテーブルの1番後ろに追加した「性別ID」列が追加されます。
単純に列を追加しただけであるため、各レコード内の「性別ID」列の中はNullの状態になっています。


列追加時に制約を付与する

前項のALTER TABLEのSQLでは「性別ID」列を追加することができましたが、追加したときに列内の値がすべてNullで追加されてしまいます。
Nullではなく初期値を設定したいという場合にはテーブル作成時にも使用するDEFAULTとNOT NULLを使用して初期値を設定します。
(1)構文

ALTER TABLE <対象テーブル名> ADD <追加したい列の列名> <データ型> DEFAULT <初期値> NOT NULL;


前項で紹介したALTER TABLEのSQL文にDEFAULTとNOT NULLを付けたしました。
列追加時にこのように設定することで列内にNullが入ることを防ぐことができます。



(2)使用例

--「性別ID」列追加SQL
ALTER TABLE T_EMPLOYEE ADD SEX_ID NVARCHAR(1) DEFAULT '1' NOT NULL;

①「性別ID」列追加前の従業員テーブル(T_EMPLOYEE)


f:id:rumr-Labo:20190604020639p:plain



②「性別ID」列追加後の従業員テーブル(T_EMPLOYEE)


f:id:rumr-Labo:20190604031115p:plain


画像の通り、性別ID列の値はすべて列追加時に値「1」が入るようになります。
注意としてはALTER TABLEのSQL作成時にNOT NULLを設定しておかないと列追加時に値が「1」ではなく、Nullが入ってしまうということです。
これはDEFAULTはあくまでも列登録時に適応される制約であるためだと思われます。

そのため、列を新規に追加するという場合に初期値を決めておきたいという場合にはDEFAULTとNOT NULLを定義しておく必要があります。



③NOT NULLを定義せず、DEFAULTのみを定義して列を追加した場合


f:id:rumr-Labo:20190604032204p:plain


テーブルから指定の列を削除する場合

テーブルから指定の列を削除したいという場合にもALTER TABLEを使用して列を削除します。

(1)構文

ALTER TABLE <対象テーブル名> DROP COLUMN <削除したい列の列名>;


列追加時と同じくALTER TABLEを先頭に書き、後ろに対象とするテーブル名を書きます。
その後ろでDROP COLUMNと書き、削除したい列の列名を設定します。


(2)使用例


①「性別ID」列削除前の従業員テーブル(T_EMPLOYEE)


従業員の情報を取り扱っているT_EMPLOYEEテーブルから「性別ID」列(SEX_ID)を削除します。

f:id:rumr-Labo:20190604031115p:plain


②「性別ID」削除SQL

--「性別ID」列削除SQL
ALTER TABLE T_EMPLOYEE DROP COLUMN SEX_ID;


③実行結果


f:id:rumr-Labo:20190604040246p:plain

削除する対象列に制約設定が存在しない場合(PRIMARY KEY制約やNOT NULL制約等)は上記のSQL文で列の削除が可能です。
しかし、対象列に制約が設定されている場合SQL実行時に実行エラーが出ます。


f:id:rumr-Labo:20190604034101p:plain


詳しくはわかりませんが、削除対象となる列がオブジェクトの参照先となっており、依存関係?にあることで削除ができないようです。
そのため、このままでは列の削除ができません。(一応テーブルを丸ごと削除し、テーブル再作成時に削除したい列を削除しておけばできなくはないですが、お勧めできないです。)
問題を解決するためには削除を実行できるように対象列の依存関係を削除します。要は対象列を参照しているオブジェクト(おそらくは制約そのもの)を解除してあげることです。


オブジェクトの削除

(1)構文

ALTER TABLE <対象テーブル名> DROP CONSTRAINT<削除したいオブジェクト名>;


上記の構文でオブジェクトの削除を行います。構文内の「削除したいオブジェクト名」は列削除の実行エラー時に表示されていたオブジェクト のことです。(今回の実行エラーではDF__T_EMPLOYE__SEX_I__282DF8C2)

(2)実際の使用例


①オブジェクトを解除するALTER TABLE

--「性別ID」列制約削除SQL
ALTER TABLE T_EMPLOYEE DROP CONSTRAINT DF__T_EMPLOYE__SEX_I__282DF8C2;


上記のSQLを使用して制約の解除を行います。


②実行結果


f:id:rumr-Labo:20190604035835p:plain


実行後、先ほど実行エラーで使用できなかった列削除用のSQL文を実行します。


f:id:rumr-Labo:20190604040101p:plain



③「性別ID」列削除後の従業員テーブル(T_EMPLOYEE)


f:id:rumr-Labo:20190604040246p:plain