ラベル MySQL の投稿を表示しています。 すべての投稿を表示
ラベル MySQL の投稿を表示しています。 すべての投稿を表示
2012/11/24

[SQLearning][MySQL]テーブルの変更・削除

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」の第4回です。
前回: [SQLearning][MySQL]データ型・制約の指定 | DevAchieve
第4回は「テーブルの変更・削除」についてです。

カラムの追加

前回同様、以下のテーブルを元に解説していきます。
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | NO   | UNI | NULL    |                |
| description | text         | YES  |     | NULL    |                |
| price       | int(11)      | NO   |     | NULL    |                |
| tax_free    | tinyint(1)   | NO   |     | 0       |                |
| reg_date    | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
このテーブルにカラムを追加するには以下のように記述します。
ALTER TABLE <テーブル名> ADD <追加するカラム名> <型> <制約>;
ALTER TABLE products
    ADD bar_code varchar(255) NOT NULL DEFAULT '0-000000-000000' AFTER tax_free;
カラムの追加位置は AFTER で指定します。未指定の場合は末尾に追加されます。
先頭に追加する場合は以下のように FIRST で指定します。
ALTER TABLE products
    ADD products_type_id int(11) NOT NULL DEFAULT 0 COMMENT '商品タイプ' FIRST;
また、複数追加する場合は以下のようにカンマ区切りで記述します。
ALTER TABLE products
    ADD receipt_name varchar(255) NOT NULL COMMENT 'レシート表示名' AFTER name,
    ADD url varchar(255) NULL DEFAULT NULL COMMENT '商品ページURL' AFTER description;

カラムの変更

カラム名、カラムの型や制約を変更する場合は以下のように記述します。
ALTER TABLE <テーブル名> CHANGE <古いカラム名> <新しいカラム名> <型> <制約>;
ALTER TABLE products
    CHANGE url homepage_url varchar(255) NULL DEFAULT NULL COMMENT '商品ホームページURL';

カラムの型や制約だけを変更したい場合は以下のように記述します。
ALTER TABLE <テーブル名> MODIFY <変更するカラム名> <型> <制約>;
ALTER TABLE products
    MODIFY bar_code varchar(13) NOT NULL DEFAULT '0000000000000' AFTER id;
AFTER でカラムの順番も変更することもできます。
Oracleの独自実装の互換性対応のため実装されているようです。

カラムのデフォルト値を削除したい場合は以下のように記述します。
ALTER TABLE <テーブル名> ALTER <カラム名> DROP DEFAULT;
ALTER TABLE products
    ALTER bar_code DROP DEFAULT;

カラムのデフォルト値を設定したい場合は以下のように記述します。
ALTER TABLE <テーブル名> ALTER <カラム名> SET DEFAULT <デフォルト値>;
ALTER TABLE products
    ALTER bar_code SET DEFAULT '0000000000000';

カラムの削除

カラムを削除したい場合は以下のように記述します。
ALTER TABLE <テーブル名> DROP <削除するカラム名>;
ALTER TABLE products
    DROP homepage_url;

ADD, ALTER, CHANGE, DROP はカンマで区切ることによって一度に複数の変更を実行することができます。
ALTER TABLE では元テーブルの一時コピーを作成するため一度に変更を実行したほうが良いです。
ほとんどの場合、 ALTER TABLE は元テーブルのテンポラリ コピーを作成する事で起動します。
そのコピー上で変更が行われ、その後元テーブルが削除されて新しいテーブルがリネームされます。
ALTER TABLE が実行している間、他のクライアントが元テーブルを読む事ができます。
新しいテーブルの準備ができるまで更新と書き込みは止められ、
その後更新に失敗する事なく新しいテーブルに自動的にリダイレクトされます。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.2 ALTER TABLE 構文

AUTO_INCREMENT の値の変更

以下のように記述します。
ALTER TABLE <テーブル名> AUTO_INCREMENT = <値>;
ALTER TABLE products AUTO_INCREMENT = 100;
AUTO_INCREMENT カラム内の最高値以下の値が指定された場合、
MyISAMでは最高値+1にリセットされますが、InnoDBではエラーも出ず、変更もされません。

おまけ: AUTO_INCREMENT の振り直し

挿入と削除を繰り返していると id が歯抜け状態になるので振り直したい時に使えます。
データ不整合を起こす可能性があるのでよく検討してから使用してください。
ALTER TABLE products
    CHANGE id renamed_id int(11);
ALTER TABLE products
    ADD id int(11) NOT NULL AUTO_INCREMENT FIRST,
    ADD PRIMARY KEY(id),
    DROP renamed_id;
単純に id を DROP してから追加しないのは先に DROP すると順序が変わる可能性があるからです。

テーブル名の変更

ALTER TABLE <テーブル名> RENAME TO <新しいテーブル名>
RENAME TABLE <テーブル名> TO <新しいテーブル名>
標準SQLでテーブル名の変更が定義されていないので独自実装で方法が幾つかあります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.19 RENAME TABLE 構文

データベースエンジンの変更

ALTER TABLE <テーブル名> ENGINE = <エンジン名>;
ALTER TABLE products ENGINE = InnoDB;

デフォルト文字セットの変更

ALTER TABLE <テーブル名> DEFAULT CHARSET = <文字コード名>;

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.2 ALTER TABLE 構文

テーブルの削除

DROP TABLE [IF EXISTS] <テーブル名>;
DROP TABLE products;
DROP TABLE IF EXISTS products;
IF EXISTS を記述すれば存在しないテーブルの削除を試みることによるエラーを防ぐことができます。

次回

次回は「SELECT文の基礎」について予定しています。
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
2012/10/05

[SQLearning][MySQL]データ型・制約の指定

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」の第3回です。
前回: [SQLearning][MySQL]テーブルの作成・確認・削除
第3回は「データ型・制約の指定」の指定についてです。

データ型の指定

以下の CREATE 文を例にデータ型と制約の指定について解説します。
CREATE TABLE products (
    id          int(11)      NOT NULL AUTO_INCREMENT COMMENT '商品ID',
    name        varchar(255) NOT NULL UNIQUE         COMMENT '商品名',
    description text                                 COMMENT '商品の説明',
    price       int(11)      NOT NULL                COMMENT '商品の値段',
    tax_free    tinyint(1)   NOT NULL DEFAULT 0      COMMENT '非課税フラグ',
    reg_date    datetime     NOT NULL                COMMENT '登録日',
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT '商品テーブル';
int(11)
数値型です。カッコは表示幅です。値の範囲に影響を与えるものではありません。
ZEROFILL を続いて指定することによってスペースで調整される表示幅を 0 で埋めることができます。
値の範囲は -2147483648 ~ 2147483647 ですが、UNSIGNED をつければ 0 ~ 4294967295 になります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 10.2 数値タイプ
varchar
可変長の文字列型です。カッコは文字数です。(※4.1以前まではバイト数でした)
MySQL :: MySQL 3.23, 4.0, 4.1 Reference Manual :: 10.4.1 The CHAR and VARCHAR Types
(Before MySQL 4.1, the length is interpreted as number of bytes.)
MySQL 5.0.3以前は varchar は 255 バイト まででした。それ以降のバージョンでは 65535 バイト、
メタデータを除き 65532 バイト まで入れることができます。
MySQL :: MySQL 5.0 Reference Manual :: 11.1.6.1 The CHAR and VARCHAR Types
The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
文字コードが utf8 の場合は1文字3バイトなのでカッコに指定できるのは(65532/3=)21844くらいまでです。(*1)
それ以上の数を指定すると MySQLが自動的に mediumtext などに変換します。
(*1)メタデータの領域があるのか僕の環境では varchar(21835) までしか varchar として作成できませんでした。
text
可変長の文字列型です。varchar とは異なりデフォルト値を設定できません。
用途としては varchar とほとんど同じですが varchar がテーブルにインラインに格納されているのに対して
text は文字列を別ファイルとして持ち、カラムはファイルへのポインタを持っているようです。
この件については複雑な問題ですが以下の投稿によくまとまっています。
Takahiko HORIUCHI - Google+ - RDBMS に MySQL を採用したシステムで、VARCHAR の代わりに TEXT…
varchar(10000)とかで指定するくらいなら text にした方がパフォーマンス的に良いようです。
tinyint(1)
MySQL によって BOOL / BOOLEAN が内部変換された数値型です。
主にフラグ系の値を格納するのに使います。値の範囲は -127 ~ 128 です。
datetime
日時を格納する日付型です。'YYYY-MM-DD HH:MM:SS'形式で日時を保存します。

データ型は詳しく書くとリファレンスマニュアル並みの分量になるのでココでは簡単に紹介するだけに留めます。
詳しく知りたい方はMySQL :: MySQL 5.1 リファレンスマニュアル :: 10 データタイプを読むといいでしょう。

カラムの制約の指定

NULL と NOT NULL
description は NULL を許容するので NULL を指定していますが、
他のカラムは NULL を入れたくないので NOT NULL を指定します。
DEFAULT
デフォルト値を指定したい場合は DEFAULT [指定したい値] と記述します。
discount カラムはフラグを 0, 1 で管理したいのでデフォルト false で 0 を指定する、などのように使います。
AUTO_INCREMENT
id などのように自動で連番を振りたい場合は AUTO_INCREMENT を指定します。
UNIQUE
すべての値が一意でなければならない制限を指定します。
INSERT または UPDATE 時に既存の値と同じ値になる場合はエラーが発生します。
NULL を許容する場合、すべての NULL値は異なる値として扱われます。
COMMENT
カラムに対するコメントを記述することができます。
SQL 文のコメントとは異なり、SHOW CREATE TABLE 文で CREATE TABLE 文を表示した時にも表示されます。
phpMyAdmin などを使用する場合はコメントが表示されるのでフラグ系の各値の意味を記述しておくと便利です。

テーブルの制約の指定

PRIMARY KEY ( [カラム名] )
このテーブルの主キーを設定することができます。

テーブルの設定

ENGINE
データベースのストレージエンジンを指定することができます。
InnoDB と MyISAM が有名ですが 5.5 では InnoDB がデフォルトなようです。
以下のクエリでストレージエンジンの種類を確認すすることができます。
mysql> SHOW ENGINES;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.13 SHOW ENGINES 構文
また、以下のクエリで各テーブルが使用しているストレージエンジンを確認することができます。
mysql> SHOW TABLE STATUS;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.27 SHOW TABLE STATUS 構文
DEFAULT CHARSET
使用する文字セットを指定することができます。日本語を扱うなら utf8(utf8_general_ci)が一般的です。
以下のクエリでサポートしている文字セットを確認することができます。
mysql> SHOW CHARACTER SET;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.2 SHOW CHARACTER SET 構文
実行結果
MySQL :: MySQL 5.1 リファレンスマニュアル :: 9.10 MySQL でサポートされるキャラクタセットと照合順序
MySQL :: MySQL 5.5 Reference Manual :: 10.1.14 Character Sets and Collations That MySQL Supports
COLLATE
照合順序を設定することができます。文字列を比較する際に順位を決める設定です。
DEFAULT CHARSET が utf8 の場合、省略すると utf8_general_ci が設定されます。
ちなみに utf8_general_ci の ci は case-insensitive の略で、大文字小文字を区別しないという意味なので
大文字小文字を区別したい場合は utf8_bin などを指定します。
以下のようなクエリで照合順序の一覧を表示します。
mysql> SHOW COLLATION like 'utf8%';
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.3 SHOW COLLATION 構文
COMMENT
テーブルに対してもコメントを記述することができます。

次回

次回は「テーブルの変更」についてを予定しています。

SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
2012/10/01

[SQLearning][MySQL]テーブルの作成・確認・削除

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」の第2回です。
第1回: [SQLearning][MySQL]ログインとデータベースの作成・削除
第2回の今回は「テーブルの作成・確認・削除」についてです。

データベースの選択

第1回で作成した shop データベースにテーブルを作成するわけですが、
まずはテーブルを作成するクエリを投げる前にデータベースを選択しなければいけません。
データベースを選択していないとERROR 1046 (3D000): No database selectedというエラーが発生します。
mysql> USE shop;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.3.3 USE 構文

テーブルの作成

CREATE TABLE Shohin (
    shohin_id     CHAR(4)       NOT NULL,
    shohin_mei    VARCHAR(100)  NOT NULL,
    shohin_bunrui VARCHAR(32)   NOT NULL,
    hanbai_tanka  INTEGER       ,
    shiire_tanka  INTEGER       ,
    torokubi      DATE          ,
    PRIMARY KEY (shohin_id)
);
すでにテーブルが存在する場合はエラーになりますが IF NOT EXISTS と書くことでエラーを防ぐことができます。
CREATE IF NOT EXISTS TABLE Shohin (
    shohin_id     CHAR(4)       NOT NULL,
    shohin_mei    VARCHAR(100)  NOT NULL,
    shohin_bunrui VARCHAR(32)   NOT NULL,
    hanbai_tanka  INTEGER       ,
    shiire_tanka  INTEGER       ,
    torokubi      DATE          ,
    PRIMARY KEY (shohin_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.8 CREATE TABLE 構文

テーブルの確認

テーブル情報はいくつかのクエリで確認することができます。
SHOW TABLES 構文
データベースのテーブル一覧を表示します。
mysql> SHOW TABLES;
+----------------+
| Tables_in_shop |
+----------------+
| Shohin         |
+----------------+
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.28 SHOW TABLES 構文
DESCRIBE 構文 または SHOW COLUMNS 構文
データ型や制約などを表示します。DESCRIBE 構文は SHOW COLUMNS 構文 のショートカットです。
mysql> DESCRIBE Shohin;
または
mysql> DESC Shohin;
または
mysql> SHOW COLUMNS FROM Shohin;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| shohin_id     | char(4)      | NO   | PRI | NULL    |       |
| shohin_mei    | varchar(100) | NO   |     | NULL    |       |
| shohin_bunrui | varchar(32)  | NO   |     | NULL    |       |
| hanbai_tanka  | int(11)      | YES  |     | NULL    |       |
| shiire_tanka  | int(11)      | YES  |     | NULL    |       |
| torokubi      | date         | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.3.1 DESCRIBE 構文
SHOW TABLE STATUS 構文
テーブルに関するさらに詳しい情報を表示します。
mysql> SHOW TABLE STATUS;
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name   | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Shohin | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |            0 |   9437184 |           NULL | 2012-09-29 22:44:57 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.27 SHOW TABLE STATUS 構文
SHOW CREATE TABLE 構文
CREATE 文を表示します。
mysql> SHOW CREATE TABLE Shohin;
CREATE TABLE `Shohin` (
  `shohin_id` char(4) NOT NULL,
  `shohin_mei` varchar(100) NOT NULL,
  `shohin_bunrui` varchar(32) NOT NULL,
  `hanbai_tanka` int(11) DEFAULT NULL,
  `shiire_tanka` int(11) DEFAULT NULL,
  `torokubi` date DEFAULT NULL,
  PRIMARY KEY (`shohin_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
MySQL によって自動的に変換されていることがわかります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.5.4.9 SHOW CREATE TABLE 構文

テーブルの削除

mysql> DROP TABLE Shohin;
テーブルが存在していなかった場合はエラーになりますが IF EXISTS と書くことでエラーを防ぐことができます。
mysql> DROP TABLE IF EXISTS Shohin;
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.14 DROP TABLE 構文

次回

次回は「データ型・制約の指定」についてを予定しています。
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
2012/09/29

[SQLearning][MySQL]ログインとデータベースの作成・削除

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」を始めます。
第1回は「データベースの作成」です。

準備は以下の記事で済んでいると想定します。
MacにMySQLを導入してみた | DevAchieve
※想定する MySQL のバージョンは5.1ですが5.5で実行・確認しています。
バージョンによる差異がある場合はマニュアルを併記しておくつもりです。

MySQL クライアントへのログイン

匿名ユーザーとしてログイン
mysql
ユーザー名を指定してログイン
mysql -u [ユーザー名] -p
root としてログイン
mysql -u root -p
まだユーザーを作成したり、パスワードを設定していないのでパスワードなしで root としてログインします。

データベースの新規作成

mysql> CREATE DATABASE shop;
ちなみに作成できたかは以下のクエリで確認できます。
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| shop               |
| test               |
+--------------------+

データベースの削除

mysql> DROP DATABASE shop;

MySQL クライアントからログアウト

mysql> exit
または
mysql> quit

次回

次回は「デーブルの作成とデータ型・制約の指定」についてを予定しています。

SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
2012/09/24

MacにMySQLを導入してみた

MySQL :: Download MySQL Community Serverから Mac OS X ver.~ DMG Archive をダウンロードする。
32bit / 64bit の判別方法はターミナルでgetconf LONG_BITを入力して返ってきた値らしい。
適当にパッケージっぽいもの開いてインストールしたら以下のコマンドを入力する。
sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
参考: MySQL :: MySQL 5.1 リファレンスマニュアル :: 2.5 Mac OS X に MySQL をインストールする

これで/usr/local/mysql/bin/mysqlと入力すれば mysql が使える。
しかし、こんなの毎回入力してたら死ねるので alias の設定をする。

僕は zsh を使っているので /Users/wada/.zshrc に alias mysql=/usr/local/mysql/bin/mysqlを記述した。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 2.5 Mac OS X に MySQL をインストールするによると
以下の2行を書いておくといいらしい。
alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin
.zshrc に記述したら設定を反映するためにsource /Users/wada/.zshrcと入力する。
参考: bash から zsh に乗り換えた【その仕事、蠍は留守です】

これでどこでもターミナル上で mysql と打つだけで MySQL が使えるようになる。
これでやっと SQL の勉強を始めることができそうだ。

タグ(RSS)