<<<back

MySQLについて 四

レコードの追加と削除
 テーブルができたら後はレコード(データ・アイテム)をぶち込んでいきましょう。
 データの挿入はinsertコマンドを使います。
 構文は、

insert into テーブル名 values (値1, 値2...);

あるいは、特定のフィールド名を指定して、

insert into テーブル名 (フィールド名1, フィールド名2...) values (値1, 値2...);

とします。
 web_tbテーブルに新規にレコードを挿入し、その内容を確認してみましょう。

insert into web_tb values('', 'MySQL徹底入門: ウェブに最適な高速フリー・データベース・サーバー', '日本MySQLユーザ会', '翔泳社', '2001', '373p.', '4881359770', '\3200+税', '', 'CD-ROM付き');

 ここでは、シリーズ名はnull値としていますが、idはauto_incrementですので、null値のままで自動的に数値がふられます。

mysql> insert into web_tb values('', 'MySQL徹底入門: ウェブに最適な高速フリー・データベース・サーバー', '日本MySQLユーザ会', '翔泳社', '2001', '373p.', '4881359770', '\3200+税', '', 'CD-ROM付き');[Enter Key]
Query OK, 1 row affected (0.00 sec)

mysql> select * from web_tb;

+----+-------------------------------------------------------------+
| id | title                                                      |
+----+-------------------------------------------------------------+
|  1 | MySQL徹底入門: ウェブに最適な高速フリー・データベース・サーバー |
+----+-------------------------------------------------------------+

-------------------+-----------+------+-------+------------+
author            | publisher | py   | page  | isbn        |
-------------------+-----------+------+-------+------------+
 日本MySQLユーザ会 | 翔泳社    | 2001 | 373p. | 4881359770  |
-------------------+-----------+------+-------+------------+

---------+--------+------------+
  price  | series | note       |
---------+--------+------------+
 3200+税 |        | CD-ROM付き |
---------+--------+------------+
1 row in set (0.00 sec)

 レコードを削除するのはdeleteコマンドです。

delete from web_tb where id=1;

とすれば入力したばかりのレコードは削除されます。

mysql> delete from web_tb where id=1;[Enter Key]
Query OK, 1 row affected (0.00 sec)

mysql> select * from web_tb;[Enter Key]
Empty set (0.00 sec)

mysql>

 レコードの更新(変更)を行うのはupdateコマンドです。
 レコード1のauthorフィールドに、監修者であるとみたまさひろ氏とSoft Agencyを加えてみます。
 ここでは、著者、編者、訳者などの責任表示が複数存在する場合は、;(セミコロン)で区切ることにします。

update web_tb set author='日本MySQLユーザ会; とみたまさひろ; Soft Agency' where id=1;

と入力した後に、selectコマンドでどのように変わったか確認しておきましょう。

mysql> update web_tb set author='日本MySQLユーザ会; とみたまさひろ; Soft Agency' where id=1;[Enter Key]
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select author from web_tb;[Enter Key]

+------------------------------------------------+
| author                                         |
+------------------------------------------------+
| 日本MySQLユーザ会; とみたまさひろ; Soft Agency   |
+------------------------------------------------+
1 row in set (0.00 sec)

mysql>

 insertとupdateの両方の機能を兼ね備えたreplaceコマンドもあります。
 replaceは、データの挿入を行いながら、重複するレコードが存在すれば上書きしていきます。
 構文は、

replace into テーブル名 values (値1, 値2...);

あるいは、 replace into テーブル名 (フィールド1, フィールド2...) values (値1, 値2...);

です。
 また、insert, replaceの際に、select文の結果を挿入することも可能です。
 構文は、

insert into テーブル名 (フィールド名) value(値) select文;

replace into テーブル名 (フィールド名) value(値) select文;

などとなります。

 レコードの挿入・削除・更新に関するコマンドを以下に示しておきます。

操作内容 構文
レコードの追加 insert into [table] values('[value1]', '[value2]'...);
レコードの追加
フィールドの指定
insert into [table] ([field1], [field2]...) values('[value1]', '[value2]'...);
レコードの追加
select文の併用
insert into [table] values('[value1]', '[value2]'...) select...;
レコードの追加・置換 replace into [table] values('[value1]', '[value2]'...);
レコードの追加・置換
フィールドの指定
repalce into [table] ([field1], [field2]...) values('[value1]', '[value2]'...);
レコードの追加・置換
select文の併用
replace into [table] values('[value1]', '[value2]'...) select...;
レコードの更新 update [table] set [field]='[value]' where [field]='[value]';
レコードの削除 delete from [table] where [field]='[value]';

ファイルの読み込み
 レコードを入力するのに、パコパコと一件ずつ入力していたのでは日が暮れてしまいます。
 通常は、別にデータ・ファイルを作っておいて、あるいは、既存のデータ・ファイルからテーブルにレコードを一気に読み込むことの方が多いでしょう。
 そのための方法として、load data infile文があります。
 基本構文は、

load data infile 'ファイル名' into table テーブル名 fields terminated by '区切り文字' lines terminated by '改行記号';

です。
 load data infile文を実行するには、読み込まれるべきファイルがMySQLサーバのあるマシンと同じマシン上になければなりません。
 ファイル名はフルパスで指定する必要がありますが、面倒であれば、当該テーブルが格納されているのと同じディレクトリ内(この場合は、c:\mysql\data\web_db)にファイルを置いておけば、ファイル名だけ入力すればOKです。
 区切り文字はデフォルトではタブ区切りとなっていますので、それ以外の区切り文字を使用する場合は、field terminated byオプションで指定して下さい。
 また、改行記号はデフォルトでは\n(LF)となっています。
 Windowsの改行文字は\r\n(CRLF)ですので、必ず、

line terminated by '\r\n'

と指定しておかなければなりません。

 ここでは、data.txtというファイルを読み込みます。
 このファイルは大東文化大学図書館の所蔵レコードの一部を整形して抜き出していただいたものです。
 一部、データが壊れていたりします。

 個人による学習・教育・研究のための利用の場合のみ複製を許諾いたしますが、それ以外の目的での利用や、有償・無償を問わず再頒布に関してはお断りしていますのでヨロシク。

 このファイルにはカンマ区切りの6,595件の書誌レコードが書き込まれています。
 但し、さきほど設計したweb_tbテーブルとは構造が異なりますので、ここでは、改めて、bib_tbというテーブルを作成しました。
 bib_tbテーブルの構造とフィールドの定義は以下の通りとしました。

フィールド名 データ型 備考
id int ID番号, 主キー, not null, auto_increment
title varchar(255) タイトル, not null
author varchar(255) 著者名
pp varchar(50) 出版地
publisher varchar(50) 出版者
py int 出版年
page varchar(50) ページ数
subject varchar(255) 件名
ndc varchar(50) NDC分類記号

 次に、この設計図通りbib_tbテーブルを作成します。

create table bib_tb (id int unsigned auto_increment not null primary key, title varchar(255) not null, author varchar(255), pp varchar(50), publisher varchar(50), py int, page varchar(50), subject varchar(255), ndc varchar(50));

 ここでは、idフィールドをunsignedのint型にしています。
 unsignedがついた場合のint型は、4バイトの正の整数(0〜4294967295)となります。
 また、create tableの段階で、idにauto_incrementとprimary keyを指定しています。

mysql> create table bib_tb (id int unsigned auto_increment not null primary key, title varchar(255) not null, author varchar(255), pp varchar(50), publisher varchar(50), py int, page varchar(50), subject varchar(255), ndc varchar(50));[Enter Key]
Query OK, 0 rows affected (0.00 sec)

mysql> show fields from bib_tb;[Enter Key]

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      |      | PRI | NULL    | auto_increment |
| title     | varchar(255) |      |     |         |                |
| author    | varchar(255) | YES  |     | NULL    |                |
| pp        | varchar(50)  | YES  |     | NULL    |                |
| publisher | varchar(50)  | YES  |     | NULL    |                |
| py        | int(11)      | YES  |     | NULL    |                |
| page      | varchar(50)  | YES  |     | NULL    |                |
| subject   | varchar(255) | YES  |     | NULL    |                |
| ndc       | varchar(50)  | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)

 後はload data infile文を使ってデータを読み込むだけです。
 ここでは、読み込むテーブルと同じ場所にあるファイル(c:\mysql\data\web_db\data.txt)を読み込みますので、フルパスではなくファイル名のみを指定すればOKです。
 コマンドは、

load data infile 'data.txt' into table bib_tb fields terminated by ',' lines terminated by '\r\n';

となります。

mysql> load data infile 'data.txt' into table bib_tb fields terminated by ',' lines terminated by '\r\n';[Enter Key]
Query OK, 6595 rows affected (0.20 sec)
Records: 6595 Deleted: 0 Skipped: 0 Warnings: 6639

mysql>

 これでデータが読み込まれました。
 警告が6639も出てしまいましたが、あまり気にしないでおきましょう。
 ちなみに、外部データ・ファイルの読み込みはload data infile文だけではなく、mysqlimportコマンドでも可能です。
 bib_tbテーブルに何件のレコードが読み込まれているのかを確認するには、

select count(*) from bib_tb;

と入力します。
 するとcount関数が実行され、件数が表示されます。

mysql> select count(*) from bib_tb;
+----------+
| count(*) |
+----------+
|     6595 |
+----------+
1 row in set (0.00 sec)

ファイルへの書き出し
 一方、読み込みがあれば書き出しもあります。
 書き出しはselectコマンドを使います。
 構文は以下の通りです。

select フィールド名 into outfile 'ファイル名' fields terminated by '区切り文字' lines terminated by '改行記号' from テーブル名 where フィールド名='値';

 ここで、検索条件指定のwhere フィールド名='値'は、完全一致の場合ですが、部分一致とする場合は、like演算子を用いて、 where フィールド名 like '%値%'

とします。
 また、出力ファイルはMySQLサーバのあるマシンに書き出されます。
 とくにパスを指定しなければ、やはり、当該テーブルを持つデータベースのディレクトリにファイルが作成されます(この場合は、c:\mysql\data\web_db)。
 例えば、authorフィールド中に部分文字列'池内'を含むレコードを検索して、それを出力ファイル(output.txt)に書き出すならば、以下のように入力すればOKです。

select * into outfile 'output.txt' fields terminated by ',' lines terminated by '\r\n' from bib_tb where author like '%池内%';

mysql> select * into outfile 'output.txt' fields terminated by ',' lines terminated by '\r\n' from bib_tb where author like '%池内%';[Enter Key]
Query OK, 5 rows affected (0.00 sec)

mysql>

 全部で5件が検索されました。
 出力されたoutput.txtの中身を確認しておきましょう。