おさらい 途中 新しく作ったデータベースに旧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)
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。