Chapter11 構造の変更と値の挿入

概要と目標 テーブルの構造を変更する方法と、
レコードを挿入方法を知ろう。

テーブルのフィール情報を変更したり、
レコードを挿入できるようになろう。

今回のゴール

コマンドプロンプト

mysql> alter table users add created datetime;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table users add modified datetime;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql> desc users;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)     | NO   |     | NULL    |                |
| email    | varchar(100)     | NO   | UNI | NULL    |                |
| password | varchar(255)     | NO   |     | NULL    |                |
| created  | datetime         | YES  |     | NULL    |                |
| modified | datetime         | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql>
mysql> insert into users(
    ->   name,
    ->   email,
    ->   password,
    ->   created,
    ->   modified
    -> )
    -> values (
    ->   '前田',
    ->   'maeda@dummy.com',
    ->   'maemae',
    ->   '2017/04/03 10:00:00',
    ->   '2017/04/03 10:00:00'
    -> ),
    -> (
    ->   '大島',
    ->   'oshima@dummy.com',
    ->   'oshioshi',
    ->   '2017/04/05 10:00:00',
    ->   '2017/04/05 10:00:00'
    -> ),
    -> (
    ->   '高橋',
    ->   'takahashi@dummy.com',
    ->   'takataka',
    ->   '2017/04/07 10:00:00',
    ->   '2017/04/07 10:00:00'
    -> ),
    -> (
    ->   '指原',
    ->   'sashihara@dummy.com',
    ->   'sashisashi',
    ->   '2017/04/09 10:00:00',
    ->   '2017/04/09 10:00:00'
    -> );
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql>
mysql> select * from users;
+----+--------+---------------------+------------+---------------------+---------------------+
| id | name   | email               | password   | created             | modified            |
+----+--------+---------------------+------------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com     | maemae     | 2017-04-03 10:00:00 | 2017-04-03 10:00:00 |
|  2 | 大島   | oshima@dummy.com    | oshioshi   | 2017-04-05 10:00:00 | 2017-04-05 10:00:00 |
|  3 | 高橋   | takahashi@dummy.com | takataka   | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  4 | 指原   | sashihara@dummy.com | sashisashi | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
+----+--------+---------------------+------------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql>
mysql> update
    ->   users
    -> set
    ->   password = 'takatakashi',
    ->   modified = '2017-04-12 12:00:00'
    -> where
    ->   id = 3
    -> ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>
mysql> select * from users;
+----+--------+---------------------+-------------+---------------------+---------------------+
| id | name   | email               | password    | created             | modified            |
+----+--------+---------------------+-------------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com     | maemae      | 2017-04-03 10:00:00 | 2017-04-03 10:00:00 |
|  2 | 大島   | oshima@dummy.com    | oshioshi    | 2017-04-05 10:00:00 | 2017-04-05 10:00:00 |
|  3 | 高橋   | takahashi@dummy.com | takatakashi | 2017-04-07 10:00:00 | 2017-04-12 12:00:00 |
|  4 | 指原   | sashihara@dummy.com | sashisashi  | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
+----+--------+---------------------+-------------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql>
mysql> delete from users where id=4;
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from users;
+----+--------+---------------------+-------------+---------------------+---------------------+
| id | name   | email               | password    | created             | modified            |
+----+--------+---------------------+-------------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com     | maemae      | 2017-04-03 10:00:00 | 2017-04-03 10:00:00 |
|  2 | 大島   | oshima@dummy.com    | oshioshi    | 2017-04-05 10:00:00 | 2017-04-05 10:00:00 |
|  3 | 高橋   | takahashi@dummy.com | takatakashi | 2017-04-07 10:00:00 | 2017-04-12 12:00:00 |
+----+--------+---------------------+-------------+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql> 

テーブルの変更 1度作ったテーブルは、
ALTER TABLEで変更する。

テーブルのフィールド情報を変更するには、ALTER TABLEを用いる。

フィールド情報の変更
ALTER TABLE テーブル名 変更内容;

詳細は13.1.7 ALTER TABLE 構文を参照

主な変更内容
分類 書式 説明
追加 ADD [COLUMN] フィールド情報 [追加場所] フィールドの追加
[追加場所]
  • 指定なし: 末尾
  • FIRST: 先頭
  • AFTER フィールド名: 指定フィールドの後
ADD PRIMARY KEY フィールド名 主キーの追加
ADD UNIQUE フィールド名 ユニークインデックスの追加
削除 DROP [COLUMN] フィールド名 フィールドの削除
DROP PRIMARY KEY 主キーの削除
変更 CHANGE [COLUMN] 元フィールド名 新フィールド情報 フィールド情報の変更
MODIFY [COLUMN] フィールド名 データ型 [制約] データ型、制約の変更
$配列名 ̺= ̺array(値1, ̺値2, ̺値3);

フィールドを末尾に追加 追加は、ADD
デフォルトは末尾に追加。

フィールドを追加するには、ALTER TABLEコマンドにADDを用いる。
デフォルトは末尾に追加される。

フィールドを末尾に追加
ALTER TABLE テーブル名 ADD [COLUMN] 追加するフィールド情報;

[〜]: 省略可能

詳細は13.1.7 ALTER TABLE 構文を参照

テーブルの末尾に
フィールドを追加してみよう。

  1. MySQLモニタを起動
  2. 「chapter11」 › 「settings」 › 「該当文字コード」フォルダ内の「setting.sql」を
    sourceコマンド、またはファイルの内容をコピー&ペーストし、
    今回のレッスンに必要なデータベースとテーブルを作成する
テキストファイルの実行
SOURCE ファイルパス;

ファイルパス: フルパスを記述(コマンドラインツールに実行するファイルをドラッグ&ドロップすると自動で挿入される)

詳細は4.5.1.5 テキストファイルから SQL ステートメントを実行するを参照

source /php-lessons/chapter11/settings/Shift-JIS/settings.sql;

ファイルパスは変更(コマンドラインツールにドラッグ&ドロップ)して下さい

実行例

コマンドプロンプト

mysql> source /php-lessons/chapter11/settings/Shift-JIS/settings.sql

Query OK, 1 row affected (0.00 sec)

Database changed
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.03 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.02 sec)

+---------------------+
| Database            |
+---------------------+
| information_schema  |
| my_blog             |
| mysql               |
| performance_schema  |
| reservation_app     |
+---------------------+
24 rows in set (0.00 sec)

+-------------------+
| Tables_in_my_blog |
+-------------------+
| posts             |
| users             |
+-------------------+
2 rows in set (0.01 sec)

+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| title   | varchar(255)     | NO   |     | NULL    |                |
| content | longtext         | NO   |     | NULL    |                |
| created | datetime         | YES  |     | NULL    |                |
+---------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)     | NO   |     | NULL    |                |
| email    | varchar(100)     | NO   | UNI | NULL    |                |
| password | varchar(255)     | NO   |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> 
  1. 「chapter11」フォルダ内の「alter-table.sql」をテキストエディタで開く
  2. 「posts」テーブルの末尾に、「modified」というフィールドを
    datetime」型で追加するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter11/alter-table.sql
-- フィールドを末尾に追加
alter table posts add modified datetime;
desc posts;
実行例

コマンドプロンプト

mysql> alter table posts add modified datetime;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc posts;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| title    | varchar(255)     | NO   |     | NULL    |                |
| content  | longtext         | NO   |     | NULL    |                |
| created  | datetime         | YES  |     | NULL    |                |
| modified | datetime         | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> 

フィールドを指定位置に追加 AFTERキーワードで、
どこに追加するかを決める。

フィールドを指定位置に追加するには、追加するフィールド情報の後に、
AFTERを用いて、どのフィールドの後ろに追加するかを指定する。

フィールドを指定位置に追加
ALTER TABLE テーブル名 ADD [COLUMN] 追加するフィールド情報 AFTER フィールド名;

[〜]: 省略可能

詳細は13.1.7 ALTER TABLE 構文を参照

任意の位置に
フィールドを追加してみよう。

  1. 「chapter11」フォルダ内の「alter-table.sql」をテキストエディタで開く
  2. id」フィールドの後ろに「user_id」フィールドを
    int(11)」型で追加するコマンドを追記し、コマンドラインツールにコピー&ペースト
chapter11/alter-table.sql
-- フィールドを指定位置に追加
alter table posts add user_id int(11) after id;
desc posts;
実行例

コマンドプロンプト

mysql> alter table posts add user_id int(11) after id;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc posts;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id  | int(11)          | YES  |     | NULL    |                |
| title    | varchar(255)     | NO   |     | NULL    |                |
| content  | longtext         | NO   |     | NULL    |                |
| created  | datetime         | YES  |     | NULL    |                |
| modified | datetime         | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

mysql> 

フィールドを先頭に追加 FIRSTキーワードで、
先頭に追加できる。

フィールドを先頭に追加するには、追加するフィールド情報の後に、FIRSTを指定する。

フィールドを先頭に追加
ALTER TABLE テーブル名 ADD [COLUMN] フィールド情報 FIRST;

[〜]: 省略可能

詳細は13.1.7 ALTER TABLE 構文を参照

テーブルの先頭に
フィールドを追加してみよう。

  1. 「chapter11」フォルダ内の「alter-table.sql」をテキストエディタで開く
  2. テーブルの先頭に、「post_id」フィールドを
    int(11)」型で追加するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter11/alter-table.sql
-- フィールドを先頭に追加
alter table posts add post_id int(11) first;
desc posts;
実行例

コマンドプロンプト

mysql> alter table posts add post_id int(11) first;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc posts;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| post_id  | int(11)          | YES  |     | NULL    |                |
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id  | int(11)          | YES  |     | NULL    |                |
| title    | varchar(255)     | NO   |     | NULL    |                |
| content  | longtext         | NO   |     | NULL    |                |
| created  | datetime         | YES  |     | NULL    |                |
| modified | datetime         | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

mysql> 

フィールドの削除 いらないフィールドは、
DROPで。

フィールドを削除する場合は、DROPで削除するフィールド名を指定する。

フィールドの削除
ALTER TABLE テーブル名 DROP [COLUMN] 削除するフィールド名;

[〜]: 省略可能

詳細は13.1.7 ALTER TABLE 構文を参照

不要なフィールドを削除してみよう。

  1. 「chapter11」フォルダ内の「alter-table.sql」をテキストエディタで開く
  2. post_id」フィールドを削除するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter11/alter-table.sql
-- フィールドを削除
alter table posts drop post_id;
desc posts;
実行例

コマンドプロンプト

mysql> alter table posts drop post_id;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc posts;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id  | int(11)          | YES  |     | NULL    |                |
| title    | varchar(255)     | NO   |     | NULL    |                |
| content  | longtext         | NO   |     | NULL    |                |
| created  | datetime         | YES  |     | NULL    |                |
| modified | datetime         | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql> 

フィールド情報の変更 フィールド名ごとの変更は、CHANGE
データ型や制約の変更は、MODIFY

フィールド情報の変更には、CHANGEまたは、MODIFYを用います。

フィールド名ごと変更
ALTER TABLE テーブル名 CHANGE [COLUMN] 変更するフィールド名 変更後のフィールド情報;

[〜]: 省略可能
変更後のフィールド情報: フィールド名の変更だけであっても「データ型」や「制約」を指定する必要がある。

詳細は13.1.7 ALTER TABLE 構文を参照

データ型や制約の変更
ALTER TABLE テーブル名 MODIFY [COLUMN] 変更するフィールド名 変更後のデータ型 [変更後の制約];

[〜]: 省略可能

詳細は13.1.7 ALTER TABLE 構文を参照

フィールド情報を変更してみよう。

  1. 「chapter11」フォルダ内の「alter-table.sql」をテキストエディタで開く
  2. user_id」フィールドのデータ型制約変更するコマンドを記述、
    コマンドラインツールにコピー&ペースト
chapter11/alter-table.sql
-- フィールドの制約変更
alter table posts modify user_id int(11) unsigned not null;
desc posts;
実行例

コマンドプロンプト

mysql> alter table posts modify user_id int(11) unsigned not null;
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> desc posts;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id  | int(11) unsigned | NO   |     | NULL    |                |
| title    | varchar(255)     | NO   |     | NULL    |                |
| content  | longtext         | NO   |     | NULL    |                |
| created  | datetime         | YES  |     | NULL    |                |
| modified | datetime         | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

mysql> 

レコードの挿入 レコードの挿入は、INSERT文。

テーブルにレコードを挿入するには、INSERT構文を使う。
文字列は挿入する時は、「'(シングルクォート)」で囲む必要がある。

INSERTVALUES
INSERT [INTO] テーブル名 (フィールド名1, フィールド名2, フィールド名3...)
  VALUES (値1, 値2, 値3...);

[〜]: 省略可
フィールド名: 全フィールドに値を挿入する時は「()」ごと省略可能

詳細は13.2.5 INSERT 構文を参照

レコードを挿入してみよう。

  1. 「chapter11」フォルダ内の「insert.sql」をテキストエディタで開く
  2. posts」テーブルに以下のレコードを挿入するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
    "posts" テーブル
    user_id title content created modified
    2 ブログ始めました ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。 2017/04/07 10:00:00 2017/04/07 10:00:00
chapter11/insert.sql
-- レコードの挿入
insert into posts(
  user_id,
  title,
  content,
  created,
  modified
)
values (
  2,
  'ブログ始めました',
  'ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。',
  '2017/04/07 10:00:00',
  '2017/04/07 10:00:00'
);

-- レコードの一覧表示
select * from posts;
実行例

コマンドプロンプト

mysql> insert into posts(
    ->   user_id,
    ->   title,
    ->   content,
    ->   created,
    ->   modified
    -> )
    -> values (
    ->   2,
    ->   'ブログ始めました',
    ->   'ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。',
    ->   '2017/04/07 10:00:00',
    ->   '2017/04/07 10:00:00'
    -> );
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from posts;
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                    | content                                                                                                | created             | modified            |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました         | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                   | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> 

複数のレコードを挿入してみよう。

VALUES句は、「,(半角カンマ)」区切りで、複数のレコードを同時に挿入できる。

INSERTVALUES
INSERT [INTO] テーブル名 (フィールド名1, フィールド名2, フィールド名3...)
  VALUES (値1, 値2, 値3...), (値1, 値2, 値3...), (値1, 値2, 値3...);

[〜]: 省略可
フィールド名: 全フィールドに値を挿入する時は「()」ごと省略可能

詳細は13.2.5 INSERT 構文を参照

  1. 「chapter11」フォルダ内の「insert.sql」をテキストエディタで開く
  2. posts」テーブルに以下の複数のレコードを挿入するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
    "posts" テーブル
    user_id title content created modified
    2回目のブログ! こんにちは、2回目のブログですね。ちゃんと続いてますよ。 2017/04/08 10:00:00 2017/04/08 10:00:00
    3 そろそろ・・・ こんにちは、そろそろネタが尽きてきました。 2017/04/09 10:00:00 2017/04/09 10:00:00
    2 最後の投稿 こんにちは、ついに最後の投稿になりました。 2017/04/10 10:00:00 2017/04/10 10:00:00
chapter11/insert.sql
-- レコードの挿入(複数)
insert into posts(
  user_id,
  title,
  content,
  created,
  modified
)
values (
  1,
  '2回目のブログ!',
  'こんにちは、2回目のブログですね。ちゃんと続いてますよ。',
  '2017/04/08 10:00:00',
  '2017/04/08 10:00:00'
),
(
  3,
  'そろそろ・・・',
  'こんにちは、そろそろネタが尽きてきました。',
  '2017/04/09 10:00:00',
  '2017/04/09 10:00:00'
),
(
  2,
  '最後の投稿',
  'こんにちは、ついに最後の投稿になりました。',
  '2017/04/10 10:00:00',
  '2017/04/10 10:00:00'
);

select * from posts;
実行例

コマンドプロンプト

mysql> insert into posts(
    ->   user_id,
    ->   title,
    ->   content,
    ->   created,
    ->   modified
    -> )
    -> values (
    ->   1,
    ->   '2回目のブログ!',
    ->   'こんにちは、2回目のブログですね。ちゃんと続いてますよ。',
    ->   '2017/04/08 10:00:00',
    ->   '2017/04/08 10:00:00'
    -> ),
    -> (
    ->   3,
    ->   'そろそろ・・・',
    ->   'こんにちは、そろそろネタが尽きてきました。',
    ->   '2017/04/09 10:00:00',
    ->   '2017/04/09 10:00:00'
    -> ),
    -> (
    ->   2,
    ->   '最後の投稿',
    ->   'こんにちは、ついに最後の投稿になりました。',
    ->   '2017/04/10 10:00:00',
    ->   '2017/04/10 10:00:00'
    -> );
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql>
mysql> select * from posts;
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                    | content                                                                                                | created             | modified            |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました         | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                   | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  2 |       1 | 2回目のブログ!          | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                                                | 2017-04-08 10:00:00 | 2017-04-08 10:00:00 |
|  3 |       3 | そろそろ・・・           | こんにちは、そろそろネタが尽きてきました。                                                             | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  4 |       2 | 最後の投稿               | こんにちは、ついに最後の投稿になりました。                                                             | 2017-04-10 10:00:00 | 2017-04-10 10:00:00 |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql> 

レコードの変更 レコードの変更は、UPDATE文。

レコードを変更するには、UPDATE構文を使う。

UPDATE
UPDATE テーブル名
  SET フィールド名1 = 値1, フィールド名2 = 値2, フィールド名3 = 値3...
  [WHERE 条件式]
  [ORDER BY フィールド名 並び順]
  [LIMIT 最大更新数]
;

[〜]: 省略可
WHERE: 省略すると全てのレコードが更新される
ORDER BY: 並び順 … DESC(降順) / ASC(昇順)
LIMIT: 条件に一致したレコードの更新数の上限を指定できる

詳細は13.2.11 UPDATE 構文を参照

レコードを変更してみよう。

  1. 「chapter11」フォルダ内の「update.sql」をテキストエディタで開く
  2. idフィールドが「2」のレコードの、「title」と「modified」を
    変更するコマンドを記述し、コマンドラインツールにコピー&ペースト
chapter11/update.sql
-- レコードの更新
update
  posts
set
  title = '2回目の投稿!',
  modified = '2017-05-10 12:00:00'
where
  id = 2
;

select * from posts;
実行例

コマンドプロンプト

mysql> update
    ->   posts
    -> set
    ->   title = '2回目の投稿!',
    ->   modified = '2017-05-10 12:00:00'
    -> where
    ->   id = 2
    -> ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>
mysql> select * from posts;
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                    | content                                                                                                | created             | modified            |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました         | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                   | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  2 |       1 | 2回目の投稿!            | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                                                | 2017-04-08 10:00:00 | 2017-05-10 12:00:00 |
|  3 |       3 | そろそろ・・・           | こんにちは、そろそろネタが尽きてきました。                                                             | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  4 |       2 | 最後の投稿               | こんにちは、ついに最後の投稿になりました。                                                             | 2017-04-10 10:00:00 | 2017-04-10 10:00:00 |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql>  

比較演算子 WHEREの条件式は、
比較演算子を使う。

MySQLの比較演算子は、プログラミング言語の比較演算子と一部違うところがある。

比較演算子
演算子 説明
A > B A は B より大きい
A < B A は B より小さい
A >= B A は B 以上
A <= B A はB 以下
A = B A は B と等しい
A != B A は B は異なる
A <> B A は B は異なる

レコードの削除 レコードの変更は、DELETE文。

レコードを変更するには、DELETE構文を使う。

DELETE
DELETE FROM テーブル名
  [WHERE 条件式]
  [ORDER BY フィールド名 並び順]
  [LIMIT 最大更新数]
;

[〜]: 省略可
WHERE: 省略すると全てのレコードが削除される
ORDER BY: 並び順 … DESC(降順) / ASC(昇順)
LIMIT: 条件に一致したレコードの削除数の上限を指定できる

詳細は13.2.2 DELETE 構文を参照

レコードを削除してみよう。

  1. 「chapter11」フォルダ内の「delete.sql」をテキストエディタで開く
  2. idフィールドが「4」のレコードを削除するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter11/delete.sql
-- レコードの削除
delete from posts where id=4;

select * from posts;
実行例

コマンドプロンプト

mysql> delete from posts where id=4;
Query OK, 1 row affected (0.01 sec)

mysql>
mysql> select * from posts;
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                    | content                                                                                                | created             | modified            |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました         | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                   | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  2 |       1 | 2回目の投稿!            | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                                                | 2017-04-08 10:00:00 | 2017-05-10 12:00:00 |
|  3 |       3 | そろそろ・・・           | こんにちは、そろそろネタが尽きてきました。                                                             | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
+----+---------+--------------------------+--------------------------------------------------------------------------------------------------------+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql> 

テーブルのコピー すでにあるテーブルやレコードを
コピーすることもできる。

CREATE TABLE構文を使って、SELECTで抽出した結果から、
フィールドの構造やレコードをコピーした新たなテーブルを作ることが出来る。
ただし、この方法はPRIMARY KEY」や「AUTO_INCREMENT」 などの制約はコピーされないので、
後から設定する必要がある。

テーブルのフィールド構造とデータのコピー
CREATE TABLE コピー先テーブル名 SELECT * FROM コピー元のテーブル名;

詳細は 13.1.17 CREATE TABLE 構文を参照

テーブルのフィールド構造と
データをコピーしてみよう。

  1. 「chapter11」フォルダ内の「copy.sql」をテキストエディタで開く
  2. posts」テーブルをコピーした「new_posts」テーブルを作成するコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter11/copy.sql
-- テーブルのフィールド構造とデータのコピー
create table new_posts select * from posts;
select * from new_posts;
desc new_posts;
実行例

コマンドプロンプト

mysql> create table new_posts select * from posts;
Query OK, 10 rows affected (0.02 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> select * from new_posts;
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
| id | user_id | title                             | content                                                                                                   | created     | modified            |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
|  1 |       2 | ブログ始めました                  | ついに、ブログを始めました。毎日更新するので楽しみにしてくださいね。                                      | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  2 |       1 | 2回目の投稿!                     | こんにちは、2回目のブログですね。ちゃんと続いてますよ。                                                   | 2017-04-08 10:00:00 | 2017-04-08 10:00:00 |
|  3 |       3 | そろそろ・・・                    | こんにちは、そろそろネタが尽きてきました。                                                                | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
|  4 |       3 | まだやってます                    | 1度、このブログをやめようと思いまいしたが、まだやることにしました。                                       | 2017-04-11 10:00:00 | 2017-04-11 10:00:00 |
|  5 |       3 | 久しぶりの投稿                    | お久しぶりです。ちょっと日が空いてしまいましたね。                                                        | 2017-05-01 10:00:00 | 2017-05-01 10:00:00 |
|  6 |       3 | また、空いちゃいました            | お久しぶりです。またまた日が空いてしまいましたね。                                                        | 2017-05-31 10:00:00 | 2017-05-31 10:00:00 |
|  7 |       4 | おいしいお店発見!                | こんにちは、おいしいパスタのお店を発見しました。                                                          | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  8 |       5 | 一人旅してます                    | こんにちは。今、北海道にいてます。一人旅してます。                                                        | 2017-07-15 10:00:00 | 2017-07-15 10:00:00 |
|  9 |       4 | また、行っちゃいました            | こんにちは、先日見つけた美味しいパスタのお店に、また行っちゃいました。                                    | 2017-07-17 10:00:00 | 2017-07-17 10:00:00 |
| 10 |       3 | 限界です                          | こんにちは、もうブログを続けるのは限界です。                                                              | 2017-07-18 10:00:00 | 2017-07-18 10:00:00 |
+----+---------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+---------------------+---------------------+
10 rows in set (0.00 sec)

mysql> desc new_posts;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| id       | int(11) unsigned | NO   |     | 0       |       |
| user_id  | int(11) unsigned | NO   |     | NULL    |       |
| title    | varchar(255)     | NO   |     | NULL    |       |
| content  | longtext         | NO   |     | NULL    |       |
| created  | datetime         | YES  |     | NULL    |       |
| modified | datetime         | YES  |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

mysql> 
  1. PRIMARY KEY」や「AUTO_INCREMENT」の設定を行うコマンドを記述し、
    コマンドラインツールにコピー&ペースト
chapter11/copy.sql
-- 主キーや連番の設定
alter table new_posts add primary key(id);
alter table new_posts modify id int(11) unsigned auto_increment;
desc new_posts;
実行例

コマンドプロンプト

mysql> alter table new_posts add primary key(id);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table new_posts modify id int(11) unsigned auto_increment;
Query OK, 10 rows affected (0.02 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> desc new_posts;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id  | int(11) unsigned | NO   |     | NULL    |                |
| title    | varchar(255)     | NO   |     | NULL    |                |
| content  | longtext         | NO   |     | NULL    |                |
| created  | datetime         | YES  |     | NULL    |                |
| modified | datetime         | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

mysql> 
テーブルの構造とレコードを別々にコピー
テーブルの構造のみコピーし、その後にレコードを方法する方法を行えば、「PRIMARY KEY」や「AUTO_INCREMENT」などの制約もコピーされる。
テーブルの構造とレコードを別々にコピーして「new_posts」を作成した例
-- テーブルの構造をコピー
create table new_posts like posts;
desc new_posts;

-- レコードのコピー
insert into new_posts select * from posts;
select * from new_posts;

練習問題 今回の理解度をチェック。

「chapter11」フォルダ内の「training.sql」を利用し、以下の問題を解いて下さい。

実行例 (コマンド部分は省略)

コマンドプロンプト

mysql> [フィールドを末尾に追加]
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> [フィールドを末尾に追加]
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql> [フィールド情報の表示]
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255)     | NO   |     | NULL    |                |
| email    | varchar(100)     | NO   | UNI | NULL    |                |
| password | varchar(255)     | NO   |     | NULL    |                |
| created  | datetime         | YES  |     | NULL    |                |
| modified | datetime         | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

mysql>
mysql> [レコードの挿入]
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql>
mysql> [レコードの一覧表示]
+----+--------+---------------------+------------+---------------------+---------------------+
| id | name   | email               | password   | created             | modified            |
+----+--------+---------------------+------------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com     | maemae     | 2017-04-03 10:00:00 | 2017-04-03 10:00:00 |
|  2 | 大島   | oshima@dummy.com    | oshioshi   | 2017-04-05 10:00:00 | 2017-04-05 10:00:00 |
|  3 | 高橋   | takahashi@dummy.com | takataka   | 2017-04-07 10:00:00 | 2017-04-07 10:00:00 |
|  4 | 指原   | sashihara@dummy.com | sashisashi | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
+----+--------+---------------------+------------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql>
mysql> [レコードの一更新]
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>
mysql> [レコードの一覧表示]
+----+--------+---------------------+-------------+---------------------+---------------------+
| id | name   | email               | password    | created             | modified            |
+----+--------+---------------------+-------------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com     | maemae      | 2017-04-03 10:00:00 | 2017-04-03 10:00:00 |
|  2 | 大島   | oshima@dummy.com    | oshioshi    | 2017-04-05 10:00:00 | 2017-04-05 10:00:00 |
|  3 | 高橋   | takahashi@dummy.com | takatakashi | 2017-04-07 10:00:00 | 2017-04-12 12:00:00 |
|  4 | 指原   | sashihara@dummy.com | sashisashi  | 2017-04-09 10:00:00 | 2017-04-09 10:00:00 |
+----+--------+---------------------+-------------+---------------------+---------------------+
4 rows in set (0.00 sec)

mysql>
mysql> [レコードの削除]
mysql> delete from users where id=4;
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> [レコードの一覧表示]
+----+--------+---------------------+-------------+---------------------+---------------------+
| id | name   | email               | password    | created             | modified            |
+----+--------+---------------------+-------------+---------------------+---------------------+
|  1 | 前田   | maeda@dummy.com     | maemae      | 2017-04-03 10:00:00 | 2017-04-03 10:00:00 |
|  2 | 大島   | oshima@dummy.com    | oshioshi    | 2017-04-05 10:00:00 | 2017-04-05 10:00:00 |
|  3 | 高橋   | takahashi@dummy.com | takatakashi | 2017-04-07 10:00:00 | 2017-04-12 12:00:00 |
+----+--------+---------------------+-------------+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql> 
  1. フィールド名 データ型 制約 追加場所
    created 日時 なし 末尾
    modified 日時 なし 末尾 (上記 created の下)
  2. id name email password created modified
    1 前田 maeda@dummy.com maemae 2017-04-03 10:00:00 2017-04-03 10:00:00
    2 大島 oshima@dummy.com oshioshi 2017-04-05 10:00:00 2017-04-05 10:00:00
    3 高橋 takahashi@dummy.com takataka 2017-04-07 10:00:00 2017-04-07 10:00:00
    4 指原 sashihara@dummy.com sashisashi 2017-04-09 10:00:00 2017-04-09 10:00:00
    • password: "takatakashi"
    • modified: "2017-04-12 12:00:00"
解答例
chapter11/training.sql
-- フィールドを末尾に追加
alter table users add created datetime;
alter table users add modified datetime;

desc users;

-- レコードの挿入
insert into users(
  name,
  email,
  password,
  created,
  modified
)
values (
  '前田',
  'maeda@dummy.com',
  'maemae',
  '2017/04/03 10:00:00',
  '2017/04/03 10:00:00'
),
(
  '大島',
  'oshima@dummy.com',
  'oshioshi',
  '2017/04/05 10:00:00',
  '2017/04/05 10:00:00'
),
(
  '高橋',
  'takahashi@dummy.com',
  'takataka',
  '2017/04/07 10:00:00',
  '2017/04/07 10:00:00'
),
(
  '指原',
  'sashihara@dummy.com',
  'sashisashi',
  '2017/04/09 10:00:00',
  '2017/04/09 10:00:00'
);

select * from users;

-- レコードの更新
update
  users
set
  password = 'takatakashi',
  modified = '2017-04-12 12:00:00'
where
  id = 3
;

select * from users;

-- レコードの削除
delete from users where id=4;

select * from users;

解答例は全問題のチェックボックスが on になるとご覧いただけます。

まとめ レコードの挿入、更新、削除。
この3つはよく使う。

レコードの挿入、更新、削除と、次回学習するレコードの抽出は、今後よく使う構文になる。

  • テーブルのフィールド情報をの変更は、ALTER TABLE
  • レコードの挿入は、INSERT
  • レコードの更新は、UPDATE
  • レコードの削除は、DELETE