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 |
+---------+--------+--------+-------+-----------------------+
確かにコマンドどおりのレコードが入っていますね。
