テーブルにレコードを追加するには、SQLの「INSERT」というコマンドを使用します。Management StudioのGUIから操作した時にも、実は裏で自動的にこのINSERT文が実行されています。今回はこのINSERT文を説明したいと思います。
対象テーブルのスキーマ
レコードを追加するテーブルは、画像で示した社員マスタを使用します。
全部で7項目(7列)あります。データベースのデータはレコード、つまり行単位が原則になりますので、基本的にはこの7項目それぞれに対して値をセットする必要があります。それでは、このテーブルに対してレコードを追加していきましょう。
INSERT文の構文
INSERT文の構文は次のとおりです。
1 2 |
INSERT INTO テーブル名 VALUES(値1, 値2, 値3, ・・・) |
INSERT INTO の後ろに対象のテーブル名を指定します。そして、VALUESの後ろに、実際にセットする値をカンマ区切りで指定し、これをカッコで囲みます。
この書き方の場合、対象テーブルの列の定義の順番に合わせて値を並べないといけません。実際に試してみると、確かに1レコード登録されていて、列の順番通りに値がセットされていることが分かります。
1 2 |
INSERT INTO Table_Syain VALUES('00001', 'テスト社員1', 30, '男', '1983-01-03', 200000, '') |
なお、この状態でもう一度実行するともう1回登録されてしまいます。ただ、このテーブルの場合社員番号で主キー違反になり、結果的には2レコード登録されることはありません。
1 2 |
INSERT INTO Table_Syain VALUES('00001', 'テスト社員1', 30, '男', '1983-01-03', 200000, '') |
このINSERT文の書き方だと、テーブルの項目の並び順の通りに値を指定しているので、値を指定する順番を間違えると(場合によっては)エラーになります。
1 2 |
INSERT INTO Table_Syain VALUES('00001', 'テスト社員1', 30, '男', 200000, '1983-01-03', '') |
これだと非常に間違いやすいので、次に示すように通常は値をセットする対象の列名も合わせて指定します。
列名を指定したINSERT文の構文
INSERT文に、値の指定と同様に列名もカンマ区切りで記述することで、どの列に対して値をセットするのかを指定することができます。
1 2 |
INSERT INTO テーブル名(列名1, 列名2, 列名3, ・・・) VALUES(値1, 値2, 値3, ・・・) |
このようにINSERT INTO テーブル名の後ろに、列名をカンマ区切りで指定しカッコで囲みます。すると、列名1には値1がセットされ、列名2には値2がセット、という風に左から順番に対応付けられます。この書き方だと、対象テーブルの列定義の順番は無視することができます。また、最初の書き方だといつのまにか列が追加されていたりしてもSQLを見ただけでは対応しているのかどうかも分からないので、特に理由が無ければ列名の指定は必ずするようにした方がいいです。
1 2 |
INSERT INTO Table_Syain(名前, 社員番号, 年齢, 性別, 給料, 部署コード) VALUES('テスト社員2', '00002', 25, '男', '1988-10-12', 180000, '') |
列の指定を省略した場合
列名を指定する書き方の場合は、値をセットしたい項目のみ記述することができますので、列の指定を省略することもできます。省略された列には初期値がセットされることになります。
初期値とは2つあり、①スキーマ定義で当該列に対してDEFAULT制約で指定した値、又は②DEFAULT制約が無い場合はNULL、となります。今回のテーブルの場合は、生年月日がgetdate()・・・現在日時、給料が0、部署コードが”・・・空文字となっています。
それではこの3列を省略してINSERTしてみます。
1 2 |
INSERT INTO Table_Syain(社員番号, 名前, 性別, 年齢) VALUES('00003', 'テスト社員3', '女', 20) |
省略した項目に初期値がセットされていることが分かります。