insert文を再確認!便利な使い方をSQL文つきでご紹介
この記事ではinsert文の機能や代表的な使い方、注意点を解説します。仕事でRDBMSを扱っている方やSQL文に興味・関心をお持ちの方は、ぜひお読みください。
この記事ではinsert文の機能や代表的な使い方、注意点を解説します。仕事でRDBMSを扱っている方やSQL文に興味・関心をお持ちの方は、ぜひお読みください。
スキルアップ
2023/01/26 UP
- プログラミング
- 開発
- インフラエンジニア
RDBMS(リレーショナルデータベース管理システム)を扱う現場では、しばしばinsert文を見かけます。insertはデータを追加する代表的なSQL文ですが、ただ新しいデータを追加するだけの機能ではありません。複数データをまとめて追加する、他の表からデータを挿入するといった、便利な機能も備えています。
この記事ではinsert文の機能や代表的な使い方、注意点を解説します。仕事でRDBMSを扱っている方やSQL文に興味・関心をお持ちの方は、ぜひお読みください。
SQLのinsert文とはなにか?
insert文は、ひとまとまりのデータを持つ行を新たに挿入するSQL文です。RDBMSに新たな情報を追加する、重要な働きを担います。顧客情報の追加や売上情報の記録など、社会において新しい情報の追加は欠かせません。insert文はさまざまな業種において、なくてはならない働きをしています。
また他のデータから必要な部分を抽出して挿入できることも、insert文が持つ強みです。insert文の活用により、データを整理し有効活用する業務にもつなげることが可能です。
基本的なinsert文の使い方
ここからはMySQLを活用し、基本的なinsert文の使い方を確認していきましょう。以下の列を持つ「組分け」表を用意してください。
・社員番号
・組の色
・削除フラグ
MySQL8.0では、以下のSQL文で表を作成できます。
CREATE TABLE 組分け ( 社員番号 INT NOT NULL, 組の色 VARCHAR(2), 削除フラグ INT DEFAULT 0 ) DEFAULT CHARSET=utf8;
最初の段階では表の定義を決めただけで、データは何も入れていません。この状態から、データを追加していきます。代表的な2つのケースについて、確認していきましょう。
データを1行追加する
データを1行追加するSQL文は、insertのベーシックな使い方に挙げられます。基本的な使い方は、値をセットする列名を提示したうえで、対応する値を指定する方法です。以下のinsert文を確認しましょう。
INSERT INTO 組分け (社員番号, 組の色, 削除フラグ) VALUES (188021, '赤', 0);
表にある列のうち、「社員番号」「組の色」「削除フラグ」を指定して挿入するinsert文です。values句のあとに、対応する値を順番に並べてください。
ところで挿入先の「組分け」表は、「社員番号」「組の色」「削除フラグ」の順で構成されています。表のレイアウトどおりに値を指定する場合は、列名を省略し値だけを指定した挿入も可能です。以下のinsert文で、新しいデータを追加できます。
INSERT INTO 組分け VALUES (222201, '赤', 0);
両方のinsert文を実行した結果、2件のデータが入力されました。
社員番号 | 組の色 | 削除フラグ |
---|---|---|
188021 | 赤 | 0 |
222201 | 赤 | 0 |
複数のデータも1つのinsert文で追加できる
データが複数ある場合も、1行のinsert文で追加できます。データごとにinsert文を作る手間が省けるため、初期データの設定を効率的に進めることが可能です。
values句に続くかっこは、1組のデータを示します。カンマのあとにかっこを続けることで、追加すべきデータを増やせます。2つのデータを追加するinsert文を、以下に示しました。
INSERT INTO 組分け (社員番号, 組の色, 削除フラグ) VALUES (222202, '白', 0), (222203, '黄', 0);
実行すると、2行のデータが追加されます。
列の順番に合わせてデータを追加する場合は、insert文で列名を示す必要がありません。データを指定するだけで追加できます。以下のinsert文では、新たに2行のデータを追加します。
INSERT INTO 組分け VALUES (222204, '緑', 0), (222205, '青', 0);
2つのinsert文を実行した結果、新たに4件のデータが入力されました。表には6件のデータが格納されています。
社員番号 | 組の色 | 削除フラグ |
---|---|---|
188021 | 赤 | 0 |
222201 | 赤 | 0 |
222202 | 白 | 0 |
222203 | 黄 | 0 |
222204 | 緑 | 0 |
222205 | 青 | 0 |
複数のデータを追加する際には、注意すべきポイントがあります。1つでもエラーになったデータがある場合は、どのデータも追加されないことに注意してください。
使い方はデータベースにより異なる場合がある
insert文の文法は、RDBMSやバージョンにより異なる場合があることに注意しましょう。例えばOracleの場合、複数のデータを追加する場合は「INSERT ALL」を使わなければならない一方で、条件によって挿入先の表を変えることが可能です。またPostgreSQLの場合、複数件のデータ追加はバージョン8.2系からの対応となっています。
このためinsert文を使う際には、事前にRDBMSのマニュアルを参照しておくことをおすすめします。
実務に役立つinsert文の使い方をご紹介
insertでは、さまざまなデータの追加方法が用意されています。ここでは3つの例を紹介し、insert文の使い方を確認していきましょう。
ここまで解説した手順に沿ってinsert文を実行した場合、「組分け」表の状態は以下のとおりとなっています。
社員番号 | 組の色 | 削除フラグ |
---|---|---|
188021 | 赤 | 0 |
222201 | 赤 | 0 |
222202 | 白 | 0 |
222203 | 黄 | 0 |
222204 | 緑 | 0 |
222205 | 青 | 0 |
この状態から、操作を進めていきましょう。どの方法も実務に役立つため、マスターしておくことをおすすめします。
一部の列だけを指定してデータを追加できる
insert文で列を指定して追加する場合、表で定義されている列をすべて指定する必要はありません。以下のように、データを挿入したい列だけの指定も可能です。
INSERT INTO 組分け (社員番号) VALUES (221200);
このSQL文は、社員番号に221200を追加するinsert文です。組の色は指定していないため、NULLがセットされます。また削除フラグの値もinsert文で指定していないため、「組分け」表の作成時に設定されたデフォルト値の0がセットされます。
実行後、社員番号221200のデータが追加されました。
社員番号 | 組の色 | 削除フラグ |
---|---|---|
188021 | 赤 | 0 |
222201 | 赤 | 0 |
222202 | 白 | 0 |
222203 | 黄 | 0 |
222204 | 緑 | 0 |
222205 | 青 | 0 |
221200 | null | 0 |
insert文を実行する場合、挿入先の表でプライマリキーやNOT NULLが定義されている列は省略できません。必ず値を定義しましょう。もし値を定義しない場合はinsert文がエラーとなってしまい、データの追加に失敗します。
追加する列にデフォルト値を設定できる
insert文では値を指定する代わりに、デフォルト値を挿入するよう指定することも可能です。「データを1行追加する」で紹介したinsert文
INSERT INTO 組分け VALUES (222201, '赤', 0);
は、以下のように書き換え可能です。
INSERT INTO 組分け VALUES (222201, '赤', DEFAULT);
これは「組分け」表の「削除フラグ」列に、「DEFAULT 0」が設定されていることが理由です。「DEFAULT 0」は、「値を指定しない場合は、デフォルト値として0を挿入する」という意味です。「組分け」表を定義するSQL文を確認してみましょう。
CREATE TABLE 組分け ( 社員番号 INT NOT NULL, 組の色 VARCHAR(2), 削除フラグ INT DEFAULT 0 ) DEFAULT CHARSET=utf8;
defaultを使うメリットには、デフォルト値が変わってもSQL文を修正せずに済み、バグを減らせる点が挙げられます。
他の表にあるデータを選択して挿入する
insert文では、他の表にあるデータを選んで挿入することも可能です。「insert into」文で挿入先の表や列を指定したのち、select文を続けることで実現できます。挿入元となる「組分け2019」表を、以下に示しました。
社員番号 | 組の色 | 削除フラグ |
---|---|---|
219182 | 白 | null |
218178 | 黄 | null |
217174 | 白 | null |
216170 | 青 | null |
上の表から、社員番号が219000番を超える方のみ「組分け」表へデータを挿入するケースを考えてみましょう。insert文は、以下のとおりとなります。
INSERT INTO 組分け (社員番号, 組の色, 削除フラグ) SELECT 社員番号, 組の色, 削除フラグ FROM 組分け2019 WHERE 社員番号>219000;
該当者は、社員番号219182の方に限られます。実行後、「組分け」表に該当するデータが追加されたことを確認してください。
社員番号 | 組の色 | 削除フラグ |
---|---|---|
188021 | 赤 | 0 |
222201 | 赤 | 0 |
222202 | 白 | 0 |
222203 | 黄 | 0 |
222204 | 緑 | 0 |
222205 | 青 | 0 |
221200 | null | 0 |
219182 | 白 | null |
insert文を使ううえでの注意点
insert文を使う際には、注意すべきポイントが3つあります。スムーズにデータを挿入し実務を進めるためにも、以下に挙げる注意点をしっかり把握しておきましょう。
列ごとの制約をよく確認しデータを作成する
表で定義された列のなかには、制約が設けられている場合があります。プライマリキーやNOT NULLは、代表的な制約の例です。制約に適合しないデータを追加しようとしてもエラーとなり、処理が実行されません。
また追加するデータが文字列の場合は、表で定義された文字数の上限を超えないことも重要なポイントです。表の定義がどのようになっているか、事前に確認しておきましょう。
重複するデータがないか事前の確認を
データの追加でぜひ避けたい事態の一つに、重複するデータの登録が挙げられます。もしプライマリキー制約が設けられている列に重複するデータを追加しようとした場合は、エラーで弾かれます。この場合、データが重複する事態は発生しません。
一方でデータの重複を許す設定になっている場合は、同一のデータが複数登録されてしまうおそれがあります。このような事態になると、結果が2倍になるなど集計結果にも悪影響をおよぼします。データを追加する際は、事前に重複するデータがないかどうか確認しておきましょう。
大量データの追加には時間がかかる
insert文を実行した場合、データだけが更新されるわけではありません。以下の項目も、insert文の実行に併せて更新されます。
・トランザクションログ
・インデックス
このため大量のデータを追加すると、処理完了までかなりの時間を要する場合があります。所要時間は機器の性能やデータベースの設定により変わるため、過去の所要時間をもとに余裕をもったスケジュールの設定をおすすめします。
insert文を駆使して効果的なSQL文を書こう
ここまで、insert文についてさまざまな観点から解説しました。知らなかった使い方がある、意外と融通が利くと思った方もいるのではないでしょうか。
insert文を駆使することで、大量のデータを短いSQL文で効率よく、そして確実に追加できます。この記事とお使いのRDBMSから提供されている情報を参考にして、効果的なSQL文の作成と業務の効率化に役立ててください。