
【MySQL】INSERTで複数行追加する方法
2019/07/13
MySQLで1行のデータをINSERTする方法と、複数データを1つのSQLでINSERTする方法の備忘録。
たまに出てきては調べてるので、あまり何も考えずにコピペできるようにしておきたいと思います。
INSERT文の書式
書式(文法)は以下の通り。
INSERT INTO `tablename` (`field1`, `field2`) VALUES ('データ1', 'データ2');
テーブル名指定し、フィールド名に相対するデータを VALUES 以下に書いていくというスタイルです。
なお、テーブル名やカラム名を括っているクォート記号ですが、これはシングルクォーテーションではなく、キーボードの@のところにある『バッククォート』という記号で、Shift + @ で入力します。
VALUESの続くデータを括っている記号は、シングルクォーテーションです。
厳密にいえば「バッククォート」は必須ではないのですが、phpMyAdmin でダンプした SQL には括られた形で出てきたりしているので、(個人的に)テーブル名・カラム名には習慣的につけています。
データが1行の場合のINSERT文
「users」テーブルに1行のデータを登録する場合は以下のように。
[sql]
INSERT INTO users
(id
, created
, modified
, username
, memo
, status
) VALUES (NULL, NOW(), NOW(), '試験一郎', 'メモ', 1);
[/sql]
idカラムの値を null で登録するのは、Autoincriment を有効にしているためです。
次のように、わかりやすく改行しても問題ありません。
私はいつも改行して書いていくようにしています。(よくデータの数を間違えるので防止策として改行してます)
[sql]
INSERT INTO users
(
id
,
created
,
modified
,
username
,
memo
,
status
) VALUES (
NULL,
NOW(),
NOW(),
'試験一郎',
'メモ',
1
);
[/sql]
データが複数行の場合のINSERT文
INSERT文を必要数記述する方法
複数行データを追加する場合は下記のようにします。
この例では、先程紹介した1行をINSERTするSQLを複数回書いているだけです。
[sql]
INSERT INTO users
(id
, created
, modified
, username
, memo
, status
) VALUES (NULL, NOW(), NOW(), '一条将輝', 'メモ', 1);
INSERT INTO users
(id
, created
, modified
, username
, memo
, status
) VALUES (NULL, NOW(), NOW(), '二木舞衣', 'メモ', 3);
INSERT INTO users
(id
, created
, modified
, username
, memo
, status
) VALUES (NULL, NOW(), NOW(), '三矢元', 'メモ', 1);
INSERT INTO users
(id
, created
, modified
, username
, memo
, status
) VALUES (NULL, NOW(), NOW(), '四葉達也', 'メモ', 2);
[/sql]
INSERT文は1つで、データを必要数書く方法
複数レコードを1つのSQL文とする場合は、VALUES 以下をカンマ区切りで記述する形にすればOKです。
[sql]
INSERT INTO users
(id
, created
, modified
, username
, memo
, status
) VALUES
(NULL, NOW(), NOW(), '一条将輝', 'メモ', 1),
(NULL, NOW(), NOW(), '二木舞衣', 'メモ', 3),
(NULL, NOW(), NOW(), '三矢元', 'メモ', 1),
(NULL, NOW(), NOW(), '四葉達也', 'メモ', 2);
[/sql]
「'」シングルクォーテーションと「`」バッククォートについて
知って得する(?)バッククォートの話
最初の方で出てきた「'」シングルクォーテーションと「`」バッククォートですが、違いと役割を軽く説明したいと思います。
先にも書きましたが、テーブル名やカラム名に使用するバッククォートは必須ではなく、インサートやアップデートする内容(データ)をくくる際に使用するシングルクォーテーションは必須となります。
んではどういった時にバッククォート使用するのか?
それは、「SELECT * FROM `table`」のような SQL も実行可能にするためです。
少し難しく言えば「予約語」をエスケープするためです。
予約語とは、プログラミング言語の仕様によって開発者が付ける識別名として利用できない文字列のことで、通常は予約語に挙げられた単語やフレーズは変数名や関数名などに使用することはできません。
MySQLでは、TABLE、SQL、INDEX、LOCKなどが予約語として設定されており、そのままテーブル名や列名などに使うことはできません。
ただし、MySQLでは予約語をバッククォートで囲むことで、テーブル名や列名として使用可能になります。
phpMyAdminでダンプされるSQLは必ずバッククォートとシングルクォーテーションが使用されていますが、予約語が混じっていても正常動作するようにとの意味で使われているようです。
なるほどですね。
なお、本当にどうでもいいことですが、WordPress文中で「バッククォート」を使用するとなにやら変換されて文字化けや、背景色がついたりと謎現象がはっせいするらしいので、「文字参照」を使って書いています。
バッククォートの場合は「`」と書けば問題なさそうです。