おさらい 途中 新しく作ったデータベースに旧dbから値をコピーする復習を行なった free78
Tuesday,July,23,2013
最初はsadachi_productsに格納されている値を他のデーターベースのテーブルにコピーしようと考えた。
○テーブルの中身の表示 (sadachi_products)*追加したり編集したりする前に、この時点の値を他のデーターベースへバックアップしたい(移動)。
mysql> select * from sadachika_shop.sadachi_products; free62
sada_id sada_name sada_category
1 牛乳 飲み物
2 たこ焼き 食べ物
3 りんご 果物
4 ワイン 飲み物
5 ピザ 食べ物
6 ブドウ 果物
7 にんじん 野菜
8 コーラ 飲み物
9 牛丼 食べ物
10 キューイフルーツ 果物
11 ほうれん草 野菜
12 ビール 飲み物
13 天丼 食べ物
1 牛乳 Drink
2 たこ焼き Food
3 りんご Fruit
4 ワイン Drink
5 ピザ Food
6 ブドウ Fruit
7 にんじん Vegetables
8 コーラ Drink
9 牛丼 Food
10 キューイフルーツ Fruit
11 ほうれん草 Vegetables
12 ビール Drink
13 天丼 Food
そこで、データーベースの設定を見ていくことにした
○データベースを表示させる。
MySQL> show databases;
Database
sadachika_copy
sadachika_shop *ここに有るテーブルを[sadachika_copy]へ持っていく
*値を違うデーターベースに持っていくには、一応データーベースの詳細を確認しておいた方がいいよね
*特に文字セットと、照合順序
*確認した限りでは、いつも使っているdbは、文字セットが[utf8]、照合順序が[utf8_general_ci]でした。
*テーブルの設定をそのまま持って行ってもいいのだけど、デーブルの詳細も確認してみよう。
*テーブルの設定を持っていくほどのものがない、ほとんどデフォルトですね。プライマリーもユニークキーもなし、データ無しの書き込みもOK デフォルトもそのまま
○テーブルの構造を見る
mysql> show columns from sadachika_shop.sadachi_products; *columns(新聞など印刷物の)縦の段; 欄.
Field Type Null Key Default Extra
sada_id int(11) YES NULL *カラム名sada_id INT型(おそらく数字のみ入力可能)
sada_name varchar(20) YES NULL *カラム名sada_name VARCHAR型 文字による値を格納する、INT型は数字しか格納できない
sada_category varchar(20) YES NULL *カラム名sada_category VARCHAR型 文字による値を格納する
○作成したテーブル(sadachi_products)の定義を確認してみる エンジンが分りません?ENGINE=InnoDB
mysql> show create table sadachika_shop.sadachi_products\G
*********** 1. row **************
Table: sadachi_products
Create Table: CREATE TABLE 'sadachi_products'(
'sada_id' int(11) DEFAULT NULL, *カムラの名前sada_id、INT型
'sada_name' varchar(20) DEFAULT NULL, *カムラの名前sada_name、VARCHAR型
'sada_category' varchar(20) DEFAULT NULL *カムラの名前sada_category、VARCHAR型 デフォルト値はNULL 例えば→default(sada_category)と入力すると= NULLが表示される。格納はされないよね、値が無いんだから。
) ENGINE=InnoDB DEFAULT CHARSET=utf8 *やばい、エンジンの意味が分らない *utf8はデータベース作成で設定した文字セット[utf8]
1 row in set (0.02 sec) *例えば、こんな感じ、忘れないために書いておくmysql> create database sadachika_cp932db character set cp932;
*↑デフォルトはInnoDBだが、指定する場合のためにメモを残しておく InnoDBを変えたりするには、mysql> create table sadachika_novel(sada_id int) engine=MyISAM; *INT型 MyISAMと入力
○テーブルの詳細情報を取得する
mysql> show table status\G
公式SHOW TABLE STATUS LIKE 'pattern';
SHOW TABLE STATUS LIKE 'sadachi_uniquetest'\G';
SHOW TABLE STATUS LIKE 'sadachi_uniquetest'\G
公式SHOW TABLE STATUS FROM db_name LIKE 'pattern';
SHOW TABLE STATUS FROM sadachika_books LIKE 'sadachi_uniquetest';
SHOW TABLE STATUS FROM sadachika_books LIKE 'sadachi_uniquetest'\G
SHOW TABLE STATUS FROM sadachika_shop LIKE 'sadachi_products'\G
**************** 1.row **********************
Name: sadachi_products
Engine: InnoDB *この設定がわからない?どういう性能なの?
Version: 10
Row_format: Compact
Rows: 25
Avg_row_length: 655
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2013-07-10 10:08:19
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci *文字セット「utf8」のデフォルト照合順序は「utf8_general_ci」照合順序というのは複数の値を比較する時に、どのように比較するのかを定義しているもの
Checksum: NULL
Create_options:
Comment:
○○データーベースの詳細表示
↓db名SQLが作成 ↓テーブル名SQLが勝手に作成
MySQL> SELECT * FROM information_schema.schemata;
↑全カラム名を表示schema_name, default_character_set_name, default_collation_name
↑*schema_nameカラムにはデータベース名が格納されている
↑*default_character_set_nameカラムには文字セット名が格納されている
↑*default_collation_nameカラムには照合順序が格納されている。
CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH
def information_schema utf8 utf8_general_ci NULL
def book utf8 utf8_general_ci NULL
def goods utf8 utf8_general_ci NULL
def mysql utf8 utf8_general_ci NULL
def performance_schema utf8 utf8_general_ci NULL
def personal utf8 utf8_general_ci NULL
def sadachika utf8 utf8_general_ci NULL
def sadachika_books utf8 utf8_general_ci NULL *文字セットが[utf8]照合順序が[utf8_general_ci]
def sadachika_copy utf8 utf8_general_ci NULL *文字セットが[utf8]照合順序が[utf8_general_ci]
def sadachika_cp932db cp932 cp932_japanese_ci NULL
def sadachika_eucjpdb eucjpms eucjpms_bin NULL
edf sadachika_shop utf8 utf8_general_ci NULL *文字セットが[utf8]照合順序が[utf8_general_ci]
○○データーベースの詳細表示
↓db名自動作 ↓MySQLがテーブルを自動で作る(データーベースの情報を格納)
mysql> select * from information_schema.schemata
-> where schema_name = 'sadachika_shop'\G
***************** 1. row *******************
CATALOG_NAME:def
SCHEMA_NAME:sadachika_shop *データベース名
DEFAULT_CHARACTER_SET_NAME:utf8
DEFAULT_COLLATION_NAME:utf8_general_ci *「_ci」は大文字と小文字を区別しない。
SQL_PATH:NULL
1 row in set (0.13 sec)
○データベースを表示させる。
MySQL> show databases;
Database
sadachika_copy
sadachika_shop
○特定のデータベース内のテーブルを表示させる
SHOW TABLES FROM sadachika_copy; *テーブルがまったく無い様子
Empty set (0.33 set)
○本家テーブルを作成
mysql> create table sadachika_copy.sadachi_copyproducts(sada_copyname varchar(20) unique, sada_copycount int); *カラム名sada_copyname VARCHAR型 ユニークキー設定(重複を許さない), カラム名sada_copycount INT型
Query OK, 0 rows affected (0.70 sec)
○特定のデータベース内のテーブルを表示させる
SHOW TABLES FROM sadachika_copy;
Tables_in_sadachika_copy
sadachi_copyproducts *テーブルが増えた
1 row in set (0.00 set)
○カラムの構造を見る
mysql> show columns from sadachika_copy.sadachi_copyproducts;
Field Type Null Key Default Extra
sada_copyname varchar(20) YES UNI NULL *Key項目はUNI、ユニーク。
sada_copycount int(11) YES NULL
2 rows in set (0.13 sec)
○テーブルの中身の表示 (sadachi_copyproducts)
mysql> select * from sadachika_copy.sadachi_copyproducts;
Empty set (0.00 set) *現在カラムに値が格納されていない
○○○本家のテーブルを移さなくても、そのままカラムも全てこぴーしちゃお 「と、思ったんだけどテーブル、カラムの設定のみコピーできるみたい、したがって値のコピーは別の方法を検討しよう」
いろいろなテーブルからカラムの値をコピーしたい AS句とかつけてカラム名変更したりとか
○テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_sourcetable;
sada_id sada_cate sada_name
1 1 牛乳
2 1 紅茶
3 2 牛丼
4 2 天丼
5 2 親子丼
6 1 お茶
7 3 マグロ
8 4 オレンジ
9 4 りんご
10 3 さんま
11 3 鯛
12 1 水
13 4 パイナップル
14 3 うなぎ
15 3 カレイ
16 1 スプライト
○カラムの構造を見る
mysql> show columns from sadachika_shop.sadachi_sourcetable;
Field Type Null Key Default Extra
sada_id int(11) NO PRI NULL *Key項目はPRI *カラム名sada_id int(11)型
sada_cate int(11) YES NULL *カラム名sada_cate int(11)型
sada_name varchar(10) YES NULL *カラム名sada_name VARCHAR(10)型 ←十ってめずらしい。
3 rows in set (0.13 sec)
○作成したテーブル(sadachi_sourcetable)の定義を確認してみる エンジンが分りません?ENGINE=InnoDB iniファイルのデフォルトが元になってそう
mysql> show create table sadachika_shop.sadachi_sourcetable\G
*********** 1. row **************
Table: sadachi_sourcetable
Create Table: CREATE TABLE 'sadachi_sourcetable'(
'sada_id' int(11) NOT NULL, *カムラの名前sada_id、 INT型
'sada_cate' int(11) DEFAULT NULL, *カムラの名前sada_cate、INT型 ↓十
'sada_name' varchar(10) DEFAULT NULL, *カムラの名前sada_name、VARCHA(10)R型 デフォルト値はNULL 例えば→default(sada_category)と入力すると= NULLが表示される。格納はされないよね、値が無いんだから。
PRIMARY KEY ('sada_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 *やばい、エンジンの意味が分らない *utf8はデータベース作成で設定した文字セット[utf8]
1 row in set (0.02 sec) *例えば、こんな感じ、忘れないために書いておくmysql> create database sadachika_cp932db character set cp932;
*↑デフォルトはInnoDBだが、指定する場合のためにメモを残しておく InnoDBを変えたりするには、mysql> create table sadachika_novel(sada_id int) engine=MyISAM; *INT型 MyISAMと入力
○○○元テーブル(sadachi_sourcetable)設定をそのままに新しいテーブル(sadachi_copysourcetable)を作る
mysql> create table sadachika_copy.sadachi_copysourcetable like sadachika_shop.sadachi_sourcetable;
↑新しいデータベース名 ↑新テーブル名 ↑元データベース名 ↑元テーブル名
Query OK, 0 rows affected (0.14 sec)
○○テーブルの中身の表示 ↓新しいデータベース名 ↓新テーブル名
mysql> select * from sadachika_copy.sadachi_copysourcetable; *設定のみコピーし、値のコピーは行なわれていない
Empty set (0.01 sec)
○特定のデータベース内のテーブルを表示させる
SHOW TABLES FROM sadachika_copy;
Tables_in_sadachika_copy
sadachi_copyproducts
sadachi_copysourcetable *テーブルが増えた
1 row in set (0.00 set)
○作成したテーブル(sadachi_copysourcetable)の定義を確認してみる
全ての設定項目のコピーが完了しています。
(sadachika_shop.sadachi_sourcetable) → (sadachika_copy.sadachi_copysourcetable)
mysql> show create table sadachika_copy.sadachi_copysourcetable\G
*********** 1. row **************
Table: sadachi_copysourcetable
Create Table: CREATE TABLE 'sadachi_copysourcetable'(
'sada_id' int(11) NOT NULL, *カムラの名前sada_id、 INT型
'sada_cate' int(11) DEFAULT NULL, *カムラの名前sada_cate、INT型 ↓十
'sada_name' varchar(10) DEFAULT NULL, *カムラの名前sada_name、VARCHA(10)R型 デフォルト値はNULL 例えば→default(sada_category)と入力すると= NULLが表示される。格納はされないよね、値が無いんだから。
PRIMARY KEY ('sada_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 *やばい、エンジンの意味が分らない *utf8はデータベース作成で設定した文字セット[utf8]
1 row in set (0.00 sec) *例えば、こんな感じ、忘れないために書いておくmysql> create database sadachika_cp932db character set cp932;
*↑デフォルトはInnoDBだが、指定する場合のためにメモを残しておく InnoDBを変えたりするには、mysql> create table sadachika_novel(sada_id int) engine=MyISAM; *INT型 MyISAMと入力
○テーブルの中身の表示
mysql> select * from sadachika_shop.sadachi_sourcetable;
sada_id sada_cate sada_name
1 1 牛乳
2 1 紅茶
3 2 牛丼
4 2 天丼
5 2 親子丼
6 1 お茶
7 3 マグロ
8 4 オレンジ
9 4 りんご
10 3 さんま
11 3 鯛
12 1 水
13 4 パイナップル
14 3 うなぎ
15 3 カレイ
16 1 スプライト
○○○元テーブルのカラムを指定して新しいテーブルにコピーする free57
mysql> create table sadachika_copy.sadachi_newcopyproductname select sada_id, sada_name, sada_cate from sadachika_shop.sadachi_sourcetable;
↑新データベース名 ↑新テーブル名 ↑元カラム名 並ぶ順番を入れ替えています ↑元データベース名 ↑元テーブル名名
Query OK, 16 rows affected (0.48 sec)
Records: 16 Duplicates: 0 Warnings: 0
○特定のデータベース内のテーブルを表示させる
SHOW TABLES FROM sadachika_copy;
Tables_in_sadachika_copy
sadachi_copyproducts
sadachi_copysourcetable
sadachi_newcopyproductname *テーブルが増えた
3 rows in set (0.00 set)
○カラムの構造を見る
mysql> show columns from sadachika_copy.sadachi_newcopyproductname;
Field Type Null Key Default Extra
sada_id int(11) NO NULL *もとはKey項目PRIがあったが無くなっている *カラム名sada_id int(11)型
sada_name varchar(10) YES NULL *順番は入れ変わりました。*カラム名sada_name VARCHAR(10)型 ←十ってめずらしい。
sada_cate int(11) YES NULL *カラム名sada_cate int(11)型
3 rows in set (0.13 sec)
○テーブルの中身の表示 カラムの表示の順番を変えました。
mysql> select * from sadachika_copy.sadachi_newcopyproductname;
sada_id sada_name sada_cate
1 牛乳 1
2 紅茶 1
3 牛丼 2
4 天丼 2
5 親子丼 2
6 お茶 1
7 マグロ 3
8 オレンジ 4
9 りんご 4
10 さんま 3
11 鯛 3
12 水 1
13 パイナップル 4
14 うなぎ 3
15 カレイ 3
16 スプライト 1
○プライマリーキー設定が無くなってしまったので、改めて設定し直します。
VARCHAR型なら、unique その他のオプション default 'データなし', default 0, not null(データなし を許さない)
INT型なら、primary key
おさらいメモ
○カラム定義だけを変更する
mysql> alter table sadachika_shop.sadachi_food modify hirayama_id smallint;
↑対象のカラム ↑*変更したい型を入力する {元はINT型 not null(データ無しを許さない)} → SMALLINT型へ変更を行なう
○カラム名の変更、データ型の変更
mysql> alter table sadachika_shop.sadachi_food change sada_id hirayama_id int not null; *名前だけ変更するのであってもあわせて型を入力する。
↑旧カラム名 ↑新しく変更するカラム名(hirayama_id)
○○これを使う カラム名の変更、データ型の変更 ↓旧カラム名 ↓新しく変更するカラム名(sada_copyid)
mysql> alter table sadachika_copy.sadachi_newcopyproductname change sada_id sada_copyid int(11) not null primary key; *プライマリーキー設定、データ無しを許可しない設定。*名前だけ変更するのであってもあわせて型を入力する。
Query OK, 0 rows affected (0.41 sec)
Records: 0 Duplicates: 0 Warnings: 0
↓旧カラム名 ↓新しく変更するカラム名(sada_copyname)
mysql> alter table sadachika_copy.sadachi_newcopyproductname change sada_name sada_copyname varchar(20) unique;
↑二十 ↑ユニークキー
繰り返してしまった
mysql> alter table sadachika_copy.sadachi_newcopyproductname change sada_copyname sada_name varchar(20) unique;
mysql> alter table sadachika_copy.sadachi_newcopyproductname change sada_name sada_copyname varchar(20) unique;
Query OK, 16 rows affected (0.27 sec)
Records: 16 Duplicates: 0 Warnings: 0
Query OK, 16 rows affected, 1 warning (0.27 sec)
Records: 16 Duplicates: 0 Warnings: 1
mysql> alter table sadachika_copy.sadachi_newcopyproductname change sada_cate sada_copycate int(11);
Query OK, 0 rows affected (0.41 sec)
Records: 0 Duplicates: 0 Warnings: 0
○テーブルの中身の表示 カラムの表示の順番を変えました。
mysql> select * from sadachika_copy.sadachi_newcopyproductname;
sada_copyid sada_copyname sada_copycate *カラム名が変わったsada_id→sada_copyid, sada_name→sada_copyname, sada_cate→sada_copycate
1 牛乳 1
2 紅茶 1
3 牛丼 2
4 天丼 2
5 親子丼 2
6 お茶 1
7 マグロ 3
8 オレンジ 4
9 りんご 4
10 さんま 3
11 鯛 3
12 水 1
13 パイナップル 4
14 うなぎ 3
15 カレイ 3
16 スプライト 1
○カラムの構造を見る
mysql> show columns from sadachika_copy.sadachi_newcopyproductname;
Field Type Null Key Default Extra
sada_copyid int(11) NO PRI NULL *もとはKey項目PRI *カラム名sada_copyid int(11)型
sada_copyname varchar(20) YES UNI NULL *順番は入れ変わりました。*カラム名sada_copyname VARCHAR(20)型 10→20。
sada_copycate int(11) YES NULL *カラム名sada_copycate int(11)型
3 rows in set (0.01 sec)
○特定のデータベース内のテーブルを表示させる
SHOW TABLES FROM sadachika_copy;
Tables_in_sadachika_copy
sadachi_copyproducts
sadachi_copysourcetable
sadachi_newcopyproductname
3 rows in set (0.00 set)
○テーブルの中身の表示
mysql> select * from sadachika_copy.sadachi_copyproducts; *オリジナル、ただし値は格納されていない
Empty set (0.00 sec)
mysql> select * from sadachika_copy.sadachi_copysourcetable; *設定のみコピーし、値のコピーは行なわれていない 元は○○○テーブル(sadachi_sourcetable)設定をそのままに新しいテーブル(sadachi_copysourcetable)を作っくた
Empty set (0.00 sec)
mysql> select * from sadachika_copy.sadachi_newcopyproductname; *元はsadachika_shop.sadachi_sourcetableの値を移動しカラムの順番名前を変更した
Empty set (0.00 sec)
////////////////////////疲れた、日を変えたい//////////////////////////////
sadachika_shop.sadachi_products;の値をcopy.db内のどこかのテーブルの格納したいな
インサートでいいのかな?free70
トリガーもビューもおさらいしたいな。
○他のテーブルから、本家のテーブルに値を格納する
本家テーブルのsada_nameカラムにはユニーク設定が施されているので重複の値を格納できない
そこでエラーを発生させないIGNOREを入れるプログラムを作成する
↓IGNOREを入れる
mysql> insert ignore into sadachika_copy.sadachi_copysourcetable select hira_name, hira_count from sadachika_shop.hiraya_yamaguchisales;
↑格納する本家テーブル名 ↑分家カラム↑分家カラム ↑分家テーブル名
mysql> select * from sadachika_shop.sadachi_products;
sada_id sada_name sada_category
1 牛乳 飲み物
2 たこ焼き 食べ物
3 りんご 果物
○テーブルの構造を見る
mysql> show columns from sadachika_shop.sadachi_products; *columns(新聞など印刷物の)縦の段; 欄.
Field Type Null Key Default Extra
sada_id int(11) YES NULL *カラム名sada_id INT型(おそらく数字のみ入力可能)
sada_name varchar(20) YES NULL *カラム名sada_name VARCHAR型 文字による値を格納する、INT型は数字しか格納できない
sada_category varchar(20) YES NULL
○カラムの構造を見る
mysql> show columns from sadachika_copy.sadachi_copysourcetable;
Field Type Null Key Default Extra
sada_id int(11) NO PRI NULL *Key項目はPRI *カラム名sada_id int(11)型
sada_cate int(11) YES NULL *カラム名sada_cate int(11)型
sada_name varchar(10) YES NULL *カラム名sada_name VARCHAR(10)型 ←十ってめずらしい。
3 rows in set (0.13 sec)
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。