SQL-DML テーブルに行を挿入する(INSERT)

データベースのテーブルに行を挿入(データ登録)する方法を記載しておこうと思う。表に行を挿入する場合は、INSERT(インサート)命令を使用する。

サンプルテーブル

SQLのサンプルは以下のテーブルを使用して解説

テーブル名:Employee(社員テーブル)

社員の情報を管理するテーブル

属性名
カラム名
社員ID
member_id
社員名
member_name
社員名かな
member_namekana
年齢
member_age
性別
member_gender
入社日
join_company
所属部門
dept
1佐藤 太郎さとう たろう222020/04/01営業部
2田中 花子たなか はなこ302020/12/31製造部
3鈴木 次郎すずき じろう452000/05/25総務部
4西田 梅子にしだ うめこ232019/09/01販売部
社員管理テーブル

基本的な用法(列名を指定したINSERT方法)

【対応データベース】

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle
  • Access

【基本構文】

INSERT INTO 表名(列名1,列名2・・・) VALUES (値1,値2・・・)
--スクリプト風
INSERT INTO 表名(列名1,列名2・・・) VALUES (値1,値2・・・);
INSERT INTO 表名(列名1,列名2・・・) VALUES (値1,値2・・・);

INSERT INTO をセミコロン(;)で区切り複数記述することで、スクリプトとして実行することができる。VALUESに値をセットするとき、文字列型・日付型は、シングルコーテーションでくくる必要がある。

 INSERT 表名(列名1,列名2・・・) VALUES (値1,値2・・・)

SQL ServerとMySQLについては、INTOを省略することができる。

【SQLサンプル】

 INSERT INTO Employee (
     member_id
       ,member_name
       ,member_namekana
       ,member_age
       ,member_gender
       ,join_company
       ,dept
      ) VALUES (
    1
      ,'半田 三郎'
      ,'はんだ さぶろう'
      ,32
      ,'男'
      ,'2021/04/01'
      ,'総務部'
     )

INSERT VALUES 列名を省略した形式

INSERT文では、列名を省略することができる。ただし、省略した場合は、すべての列名(カラム)を指定する必要がある。

【対応データベース】

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle
  • Access
INSERT INTO 表名 VALUES(値1,値2・・・) ;

【SQLサンプル】

INSERT INTO Employee VALUES (
    ,1
      ,'半田 三郎'
      ,'はんだ さぶろう'
      ,32
      ,'男'
      ,'2021/04/01'
      ,'総務部'
     )

SELECTとWHERE句を使用したINSERT方法

SELECTの実行結果(問合せ結果)を使用して、INSERTによるデータ登録することができる。既存のテーブルにデータを継ぎ足すときに役に立つ

ただし、カラムはすべて指定する必要がある。

利用例:更新前のデータを履歴データとして登録する

【対応データベース】

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle
  • Access
INSERT INTO 表名 SELECT カラム名 FROM 表名 --標準
INSERT INTO 表名 SELECT カラム名 FROM 表名 WHERE カラム名 > 条件 

【SQLサンプル】

INSERT INTO Employee SELECT (SELECT MAX(member_id) + 1 FROM Employee )
                                  ,member_name
                                  ,member_namekana
                                  ,member_age
                                  ,member_gender
                                  ,join_company
                                  ,dept
                            FROM Employee WHERE member_age = 45 

WHERE区を使用する場合は、member_idはサブクエリでmember_idの最大を取得する。これは、member_age=45のレコードの主キーが最大値と限らないためである。

複数レコードを返す例

上記のSQL実行結果のように、WHERE句で複数行返す場合は、主キーが重複してエラーとなるため、必ず1行返す条件とすること。

SELECTとMAX関数を使用したINSERT方法

SELECTとMAX関数を使用し、主キーの最大値がセットされているレコードを取得する。最大値にプラス1を加算して、列に埋め込んだ値でレコードをINSERTで登録することができる。

使用例としては、主キーの最大値を調べることなくテーブルにレコードを追加する場面で利用できる。主キーをMAX関数やWHERE句等を使用して、必ずSELECT結果が1行となるように注意する必要がある。

INSERT INTO 表名 SELECT MAX(主キーの列名),'値2' FROM 表名 

【SQLサンプル】

 INSERT INTO Employee select max(member_id) + 1
                                  ,'武田 四郎'
                                  ,'たけだ しろう'
                                  ,27
                                  ,'男'
                                  ,'2015/04/01'
                                  ,'経理部'
                            from Employee;

【NG】

以下のSQLは、主キー重複違反となります。理由は、Employeeテーブルの全行を取得し、カラムにセットした値で埋め込んだ内容でINSERTするため。

      INSERT INTO Employee select 
                                  5          --←MAX関数を使用していないため、1行に絞っていないため
                                  ,'武田 四郎'
                                  ,'たけだ しろう'
                                  ,27
                                  ,'男'
                                  ,'2015/04/01'
                                  ,'経理部'
                            from Employee;

【解説】

max()関数によりmember_idの最大値を取得+1をした値が自動でセットされる。固定でセットした値がセットされる。max()関数を使用することで主キーの重複を防ぐことができる。

【実行前】

select文に値をセットした問い合わせ結果をそのままINSERT実行前のエビデンス

【実行後】

select文に値をセットした問い合わせ結果をそのままINSERT実行後のエビデンス

SELECTのカラムに値を埋め込むINSERT方法

SELECTのカラムに値をセットすることで、INSERTすることができる。注意点としては、FROM句を指定しないこと。

INSERT INTO 表名 SELECT '値1','値2' 

【SQLサンプル】

INSERT INTO Employee SELECT '6'
                                  ,'中田 五郎 '
                                  ,'なかた ごろう'
                                  ,48
                                  ,'男'
                                  ,'2013/04/01'
                                  ,'製造部'
      --★コメント
      --FROM句は指定しない。主キー重複エラーとなる。

UNION ALLを使用したINSERT方法

UNION ALLを使用することにより、1度のSQL実行で複数行のデータ(レコード)を登録することができる。

 INSERT INTO 表名 SELECT '値1','値2' 
      UNION ALL SELECT '値1','値2'
      UNION ALL SELECT '値1','値2'

【SQLサンプル】

INSERT INTO Employee SELECT '6'
                                  ,'中田 五郎 '
                                  ,'なかた ごろう'
                                  ,48
                                  ,'男'
                                  ,'2013/04/01'
                                  ,'製造部'
                            
       UNION ALL SELECT           '7'
                                  ,'須賀 夏子'
                                  ,'すが なつこ'
                                  ,49
                                  ,'女'
                                  ,'2013/04/01'
                                  ,'経理部'
    UNION ALL SELECT          '8'
                                  ,'佐藤 六郎'
                                  ,'さとう ろくろう'
                                  ,50
                                  ,'男'
                                  ,'2013/04/01'
                                  ,'営業部';