Create Table テーブルを作成する
新しいテーブルを作成します。
構文
create table テーブル名 (
列名 データ型
, 列名 データ型
, 列名 データ型
, 列名 データ型
・
・
)
デフォルト値を設定したい場合は、
列名 データ型 default データ
のようにデータ型の後ろにデフォルト情報を追記します。
例文
良くある社員情報のテーブルを例に挙げて例文となるSQLを示します。
情報は「社員コード」「社員名」「社員カナ名」「生年月日」「性別」「入社年月日」「郵便番号」「住所」「電話番号」とします。
create table EMPLOYEE (
ID nchar(5)
, NAME nvarchar(20)
, KANANAME nvarchar(20)
, BATHDAY DATE
, SEX nchar(1)
, JOIN_DATE DATE
, POST_CODE nchar(7)
, ADDRESS nvarchar(100)
, TEL nvarchar(11)
)
実行
テーブルの作成を実行し、正常に終了すると下のように「コマンドは正常に完了しました」と表示されます。
構文等の記述ミスがあると、メッセージ番号、レベル、状態、行の情報と大まかなエラー内容が表示されます。
例えば、IDの nchar を記述ミスして nhar とした場合、以下のようなエラーメッセージが表示されます。
メッセージ 2715、レベル 16、状態 6、行 1
列、パラメーター、または変数 #1: データ型 nhar が見つかりません。
Not NULL制約の追加
NOT NULL制約とは、テーブルにデータを追加(Insert)、更新(Update)する際、テーブル列に対する制約の一つで、その列に必ず「値」が登録される制約をとることです。
ここで言う「値」とは値が未設定の状態である「NULL」でない値のことです。
NULLとは、値が未設定の状態とも言えます。
NULLについては「データベースのNULL」に少しですが説明してありますので、NULLがピンとこない場合は参照してみてください。
構文 Not NULL制約付き
例えば上の EMPLOYEE テーブルにおいて、従業員の「NAME」の定義を NAME nvarchar(20) NOT NULL と指定し、「NAME」列のデータには必ず値を入れないと追加・更新できなようにします。
create table EMPLOYEE (
ID nchar(5)
, NAME nvarchar(20) NOT NULL
, KANANAME nvarchar(20)
, BATHDAY DATE
, SEX nchar(1)
, JOIN_DATE DATE
, POST_CODE nchar(7)
, ADDRESS nvarchar(100)
, TEL nvarchar(11)
)
実際に登録してNAME列にデータを入れずに追加(Insert)してみます。
左のオブジェクト エクスプローラーで確認すると、NAME が「NULL以外」となっているのがわかります。
実際にNULLを入れようとしても、見ての通りエラーになります。
ちなみに2行目の「’’」は空文字のことで、長さ0文字の文字列になります。
プログラム言語のなかには空文字もNULLも同じ扱いにする言語があるかもしれませんが、データベースではNULLと空文字は明確に違うので注意してください。
下に2行目の「KANANAME」をNULLにして登録したものの結果を載せます。
空文字はブランク表示になっていますが、NULLはNULと表示されます。
Select文で取得する時も
NULLなら Select * from EMPLOYEE where KANANAME is NULL
空文字なら Select * from EMPLOYEE where NAME=”
となります。
UNIQUE制約(列制約)
UNIQUE制約は列に設定し、その列に格納されるデータの中には同じコードや名称などが無い唯一のデータになるように制約を掛けることです。
上の従業員テーブルEMPLOYEEでは、IDがそれに当たることが多いです。
IDをUNIQUE設定すると同じIDは挿入できなくなります。
尚、NULL を格納することができ、またテーブルに複数列作成できます。
列にUNIQUE制約を行う構文
create table テーブル名 (
列名 データ型 [制約名] UNIQUE
)
制約名は付けなくても可。
create table EMPLOYEE2 (
ID nchar(5) UNIQUE
, NAME nvarchar(20) NOT NULL
, KANANAME nvarchar(20)
, BATHDAY DATE
, SEX nchar(1)
, JOIN_DATE DATE
, POST_CODE nchar(7)
, ADDRESS nvarchar(100)
, TEL nvarchar(11)
)
ID列の後ろに UNIQUE を付けるだけです。
ここで同じIDを挿入しようとするとエラーになります。
『メッセージ 2627、レベル 14、状態 1、行 2
制約 ‘UQ__EMPLOYEE__3214EC26A59C0AD4’ の UNIQUE KEY 違反。オブジェクト ‘dbo.EMPLOYEE2’ には重複するキーを挿入できません。重複するキーの値は (T0001) です。』と今回は表示されました。尚、機械的な制約名にならないので制約名を付けるとエラーもわかりやすくなるかも。
UNIQUE制約(テーブル制約)
テーブル制約でのUNIQUE制約は、複数列の組み合わせでUNIQUEに設定できるようになっています。もちろん1つの列のみ設定もできますが。
下の例、テーブルEMPLOYEE2-1の場合は、ID列とYYYY列の組み合わせでUNIQUEになるように設定しています。IDがT0001の人が2人居たとしても、YYYYが2020と2019のように異なればOKです。
テーブルにUNIQUE制約を行う構文
create table テーブル名 (
列名 ・・・,
[制約名] UNIQUE (列名, 列名・・・)
)
制約名は付けなくても可。
create table EMPLOYEE2_1 (
ID nchar(5)
, YYYY nchar(4)
, NAME nvarchar(20) NOT NULL
, KANANAME nvarchar(20)
, BATHDAY DATE
, SEX nchar(1)
, JOIN_DATE DATE
, POST_CODE nchar(7)
, ADDRESS nvarchar(100)
, TEL nvarchar(11)
, unique (ID, yyyy)
)
ID列YYYY列を同一で挿入しようとすると下のようにエラーがでます。
ID列YYYY列のどちらかを変えると同一ではなくなるので正常に挿入できます。
PRIMARY KEY制約(列)
PRIMARY KEY制約は列に設定し、その列に格納されるデータの中には同じコードや名称などが無い唯一のデータになるように制約を掛けることです。
上の従業員テーブルEMPLOYEEでは、IDがそれに当たることが多いです。
IDをPRIMARY KEY設定すると同じIDは挿入できなくなります。
UNIQUEとほぼ同じですが、NULL を格納することができません。INDEXが自動で作成されます。またテーブルに複数列の組み合わせで作成したい時は列制約ではなく、テーブル制約でPRIMARY KEYを設定することになります。
列にPRIMARY KEY制約を行う構文
create table テーブル名 (
列名 データ型 [制約名] PRIMARY KEY
)
制約名は付けなくても可。
create table EMPLOYEE3 (
ID1 nchar(5) primary key
, NAME nvarchar(20) NOT NULL
, KANANAME nvarchar(20)
, BATHDAY DATE
, SEX nchar(1)
, JOIN_DATE DATE
, POST_CODE nchar(7)
, ADDRESS nvarchar(100)
, TEL nvarchar(11)
)
ID列の後ろに PRIMARY KEY を付けるだけです。
ここで同じIDを挿入しようとするとエラーになります。
『
メッセージ 2627、レベル 14、状態 1、行 2
制約 ‘PK__EMPLOYEE__C49703DD6C96672F’ の PRIMARY KEY 違反。オブジェクト ‘dbo.EMPLOYEE3’ には重複するキーを挿入できません。重複するキーの値は (T0001) です。』と今回は表示されました。尚、機械的な制約名にならないので制約名を付けるとエラーもわかりやすくなるかも。
PRIMARY KEY制約(テーブル)
テーブル制約でのPRIMARY KEY制約は、複数列の組み合わせでPRIMARY KEYに設定できるようになっています。もちろん1つの列のみ設定もできますが。
下の例、テーブルEMPLOYEE2-1の場合は、ID列とYYYY列の組み合わせでPRIMARY KEYになるように設定しています。IDがT0001の人が2人居たとしても、YYYYが2020と2019のように異なればOKです。尚、NULL を格納することができませんし、INDEXも自動で作成されます。
テーブルにPRIMARY KEY制約を行う構文
create table テーブル名 (
列名 ・・・,
[制約名] PRIMARY KEY (列名, 列名・・・)
)
制約名は付けなくても可。
create table EMPLOYEE3_1 (
ID nchar(5)
, YYYY nchar(4)
, NAME nvarchar(20) NOT NULL
, KANANAME nvarchar(20)
, BATHDAY DATE
, SEX nchar(1)
, JOIN_DATE DATE
, POST_CODE nchar(7)
, ADDRESS nvarchar(100)
, TEL nvarchar(11)
, primary key (ID, yyyy)
)
FOREIGN KEY制約(テーブル)
FOREIGN KEY制約は指定した列の値を登録する時に、指定したテーブルの列の中に無くてはならないと言う制約です。
今まで上で使用してきた例題のテーブルで言うと、YYYY列がNENDOテーブルのYYYYになければならない場合に使います。
テーブルにFOREIGN KEY制約を行う構文
create table テーブル名 (
列名 ・・・,
[制約名] FOREIGN KEY (列名, 列名・・・) REFERENCES 参照テーブル名(参照列名)
)
制約名は付けなくても可。
下の例では参照先のテーブルが無いとエラーになるので、参照先のテーブル作成例も合わせて挙げています。
尚、参照先のテーブルの参照列にはPRIMARY KEYが設定されていないとエラーになります。テーブル設計時に注意しましょう。
挿入時、削除時の注意事項
EMPLOYEE4_1テーブルに挿入する時は、事前に参照先のテーブルYYYY4_1に挿入うデータ値が格納されている必要があります。
で削除時ですが、EMPLOYEE4_1からは普通に削除できるのですが、YYYY4_1から削除する際にはEMPLOYEE4_1で削除しようとするデータ値が使われているとYYYY4_1で削除時にエラーが発生します。データ整合性が保たれるためです。
create table YYYY4_1(
YYYY nchar(4)
primary key (YYYY)
)
create table EMPLOYEE4_1 (
ID nchar(5)
, YYYY nchar(4)
, NAME nvarchar(20) NOT NULL
, KANANAME nvarchar(20)
, BATHDAY DATE
, SEX nchar(1)
, JOIN_DATE DATE
, POST_CODE nchar(7)
, ADDRESS nvarchar(100)
, TEL nvarchar(11)
, foreign key (YYYY) references YYYY4_1(YYYY)
)
CHECK制約(テーブル)
CHECK制約はFOREIGN KEY制約に似ていて、その列に登録可能なデータ値をチェックするのですが、あくまでも登録時だけのチェックです。
FOREIGN KEY制約ではデータの整合性も保たれますが、CHECK制約では
テーブルにCHECK制約を行う構文
create table テーブル名 (
列名 ・・・,
[制約名] CHECK (条件式)
)
制約名は付けなくても可。
CHECK制約の条件式例
・列名1 > 10
・列名1 in (, , ,)
・列名1 between x and z
・列名1 > 10 AND 列名2 in (‘A’,’B’,’C’)
create table EMPLOYEE5_1 (
ID nchar(5)
, YYYY nchar(4)
, NAME nvarchar(20) NOT NULL
, KANANAME nvarchar(20)
, BATHDAY DATE
, SEX nchar(1)
, JOIN_DATE DATE
, POST_CODE nchar(7)
, ADDRESS nvarchar(100)
, TEL nvarchar(11)
, check (YYYY between '2010' and '2022')
)
check (YYYY in (select YYYY from [dbo].[YYYY4_1]))
のような使い方はできません。『このコンテキストではサブクエリは許可されません。スカラー式だけが許可されます。』とエラーになります。
以上、「SQL Server Create Table」でした。
尚、SQL Server にはデータベースを作成するとき、複数のストレージに渡って作ることができます。HDD(ハードディスク)の個数でパフォーマンスが変わってくるので、大規模システムでは複数のストレージを使うことが多いです。
そして、ストレージ毎にファイルグループを持つように設定し、ストレージを分けることで負荷分散を行います。
このファイルグループにそれぞれ名前を付けることができます。 デフォルトはPRIMARYで、後は任意に名前を付けられます。
テーブルやインデックを作る時に「on」指定でこのファイルグループを指定できます。
この辺りは基礎ではないので私も詳しく説明できませんが、知っておくことは大切ですので、追記しておきます。詳しく知りたい人は「SQL Server Create table on」で検索するといろいろ出てくると思います。検索してないので……多分。
ピンバック: SQL Server tableを作成してみる | 開発備忘録&ふと思ったこと