SQL-DML テーブルに行を挿入する(INSERT)
データベースのテーブルに行を挿入(データ登録)する方法を記載しておこうと思う。表に行を挿入する場合は、INSERT(インサート)命令を使用する。
サンプルテーブル
SQLのサンプルは以下のテーブルを使用して解説
テーブル名:Employee(社員テーブル)
社員の情報を管理するテーブル
属性名 カラム名 | 社員ID member_id | 社員名 member_name | 社員名かな member_namekana | 年齢 member_age | 性別 member_gender | 入社日 join_company | 所属部門 dept |
---|---|---|---|---|---|---|---|
1 | 佐藤 太郎 | さとう たろう | 22 | 男 | 2020/04/01 | 営業部 | |
2 | 田中 花子 | たなか はなこ | 30 | 女 | 2020/12/31 | 製造部 | |
3 | 鈴木 次郎 | すずき じろう | 45 | 男 | 2000/05/25 | 総務部 | |
4 | 西田 梅子 | にしだ うめこ | 23 | 女 | 2019/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することができる。注意点としては、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'
,'営業部';