MySQL: データをテーブルに追加 – INSERT文、INTO、VALUES句

INSERT文を用いて1レコードを追加する練習をしてみます。
前回までにテーブルの作成と構造の修正を行いましたが、これから使うテーブルは下記のものにします(少しフィールドを削りました)。

mysql> DESC book_list;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| book_id  | int(11)      | NO   | PRI | NULL    | auto_increment |
| title    | varchar(128) | NO   |     | NULL    |                |
| author   | varchar(32)  | NO   |     | NULL    |                |
| price    | int(11)      | NO   |     | NULL    |                |
| comments | text         | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

テーブルへのデータの挿入は基本的には以下の構文を使います。

INSERT INTO <テーブル名>
(<列名1> , <列名2>, ...)
VALUES
(<列名1へのデータ>, <列名2へのデータ>, ...);

実際にプロンプト上で打つと、

mysql> INSERT INTO book_list
    -> (book_id, title, author, price, comments)
    -> VALUES
    -> (1, 'book_A', 'auth_A', 1500, 'good, bad, excellence');

となります。最初の丸括弧「()」内で列名を列挙し、二つ目のVALUES句の丸括弧内で、挿入するレコード値を書きます。数値はそのまま書きますが、文字列はシングルクォート「’」で囲まなければいけません。仮に文字としてシングルクォート「’」を使いたい場合はその直前に「\」をつける必要があります。すなわち、「\’」と書きます。
また、主キーのフィールドに重複するデータを追加しようとすると下記のようなエラーがでます。

ERROR 1062 (23000): Duplicate entry '1' for key 1

ちなみに、INSERT文にはいくつか下記のような簡略化した書き方があります。

(<列名1> , <列名2>, …)句の省略

ただし、VALUES (…)句内のデータの順序はテーブルの列の順序に合わせなければいけません。

INSERT INTO <テーブル名>
VALUES
(<列名1へのデータ>, <列名2へのデータ>, ...);

今回のテーブルに使ってみると、

mysql> INSERT INTO book_list
    -> VALUES
    -> (2, 'book_B', 'auth_B', 2900, 'not bad, good');

これは手っ取り早くていいですね。

(<列名Y> , <列名X>, …)句とVALUES (<列名Yへのデータ>, <列名Xへのデータ>, …)句内の列順序の変更

二つの丸括弧内の「列名―代入するデータ」の対応が取れていれば、どんな順序で書いても良いです。
仮にテーブル内のフィールドがA, B, Cの順で並んでいても、

INSERT INTO <テーブル名>
(<列名C> , <列名A>, <列名B>, ...)
VALUES
(<列名Cへのデータ> , <列名Aへのデータ>, <列名Bへのデータ>, ...);

のように記述できます。試しに打ってみると、

mysql> INSERT INTO book_list
    -> (author, title, book_id, comments, price)
    -> VALUES
    -> ('auth_C', 'book_C', 3, 'interesting, amazing', 1800);

一部のフィールド値の挿入を省略

二つの丸括弧内の「列名―代入するデータ」の対応が取れていれば、全列へのデータの代入をしなくてもOKです。
例えば、テーブルにA, B, CというフィールドがあったときA, Cだけにデータを追加するには、

INSERT INTO <テーブル名>
(<列名A>, <列名C> , ...)
VALUES
(<列名A>, <列名C>, ...);

と書けます。このとき列Bには、デフォルト値が設定されているならばその値が、ないならばNULLが代入されます。
今回のテーブルでは、

mysql> INSERT INTO book_list
    -> (title, author, price, comments)
    -> VALUES
    -> ('book_D', 'auth_D', 700, 'sad, depress');

book_idフィールドを省略しましたが、このフィールドはauto_incrementを指定してあるので、前に挿入されたbook_idフィールドの値を1増やした値が代入されます。

追加されたデータを確認(検索) – SELECT文

それでは最後に以下のコマンドを打ち、上述で追加されたレコードを確認してみましょう。

mysql> SELECT * FROM book_list;
+---------+--------+--------+-------+-----------------------+
| book_id | title  | author | price | comments              |
+---------+--------+--------+-------+-----------------------+
|       1 | book_A | auth_A |  1500 | good, bad, excellence |
|       2 | book_B | auth_B |  2900 | not bad, good         |
|       3 | book_C | auth_C |  1800 | interesting, amazing  |
|       4 | book_D | auth_D |   700 | sad, depress          |
+---------+--------+--------+-------+-----------------------+

確かにコマンドどおりのレコードが入っていますね。

リファレンス