分家のテーブルの値を本家のテーブルに移行するときに同一の値がある場合、
上書きするカラムを設定をする。 free70
Friday,July,19,2013 ○特定のデータベース内のテーブルを表示させる SHOW TABLES FROM sadachika_shop; ○本家テーブルを作成 mysql> create table sadachika_shop.sadachi_sales(sada_name varchar(20) unique, sada_count int); *カラム名sada_name VARCHAR型 ユニークキー設定(重複を許さない), カラム名sada_count INT型 Query OK, 0 rows affected (0.97 sec) ○分家カラムを作成(kitta_hiroshimasales) mysql> create table sadachika_shop.kitta_hiroshimasales(kit_name varchar(20), kit_count int, kit_d date); Query OK, 0 rows affected (0.11 sec) ○入力 全てのカラムに値を格納するので省略文を用いた。 mysql> insert into sadachika_shop.kitta_hiroshimasales values('Banana', 10, '2009-10-13'), ('Melon', 7, '2009-10-12'), ->('Orange', 12, '2009-10-18'), ('Apple', 5, '2009-10-10'); Query OK, 4 rows affected (0.08 sec) Records: 4 Duplicates: 0 Warnings: 0 ○分家カラムを作成(hiraya_yamaguchisales) mysql> create table sadachika_shop.hiraya_yamaguchisales(hira_name varchar(20), hira_count int, hira_d date); Query OK, 0 rows affected (0.08 sec) ○入力 全てのカラムに値を格納するので省略文を用いた。 ↓カラムhira_nameのOrange重複2パターン目 それ以外のデータは上記と違う mysql> insert into sadachika_shop.hiraya_yamaguchisales values('Orange', 4, '2009-10-02') ,('Strawberry', 21, '2009-10-05'), ->('Orange', 7, '2009-10-07') ,('Watermelon', 3, '2009-10-12'); ↑カラムhira_nameのOrange重複3パターン目 それ以外のデータは上記と違う ↑日付だけ同じ、重複には関係ない カラム名hira_dの値は本家に格納しないからだ Query OK, 4 rows affected (0.06 sec) Records: 4 Duplicates: 0 Warnings: 0 ○テーブルの中身の表示 (kitta_hiroshimasales) mysql> select * from sadachika_shop.kitta_hiroshimasales; kit_name kit_count kit_d Banana 10 2009-10-13 Melon 7 2009-10-12 Orange 12 2009-10-18 *重複No,1 Apple 5 2009-10-10 4 rows affected (0.03 sec) ○テーブルの中身の表示 (hiraya_yamaguchisales) mysql> select * from sadachika_shop.hiraya_yamaguchisales; hira_name hira_count hira_d Orange 4 2009-10-02 *重複No,2 Strawberry 21 2009-10-05 Orange 7 2009-10-07 *重複No,3 Watermelon 3 2009-10-12 4 rows affected (0.00 sec) 上書き一覧 'Orange', 12, 2009-10-18 *kitta_hiroshimasales ↓ 'Orange', 4, 2009-10-02 *hiraya_yamaguchisales 重複している ↓ 'Orange', 7, 2009-10-07 *hiraya_yamaguchisales 重複している ○他のテーブルから、本家のテーブルに値を格納する 参照するのは2項目のカラム(kit_name kit_count) mysql> insert into sadachika_shop.sadachi_sales select kit_name, kit_count from sadachika_shop.kitta_hiroshimasales; ↑格納する本家テーブル名 ↑分家カラム↑分家カラム ↑分家テーブル名 Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 ○テーブルの中身の表示 「kitta_hiroshimasales」テーブルに含まれていたデータを「sadachi_sales」テーブルに格納する mysql> select * from sadachika_shop.sadachi_sales; sada_name sada_count Banana 10 Melon 7 Orange 12 Apple 5 4 rows affected (0.00 sec) ○他のテーブルから、本家のテーブルに値を格納する 本家テーブルのsada_nameカラムにはユニーク設定が施されているので重複の値を格納できない そこでエラーを発生させないIGNOREを入れるプログラムを作成する ↓IGNOREを入れる mysql> insert ignore into sadachika_shop.sadachi_sales select hira_name, hira_count from sadachika_shop.hiraya_yamaguchisales; ↑格納する本家テーブル名 ↑分家カラム↑分家カラム ↑分家テーブル名 *入れない場合 ERROR 1062 (23000): Duplicate entry 'Orange' for key 'sada_name' と表示される。 Query OK, 2 rows affected (0.08 sec) Records: 4 Duplicates: 2 Warnings: 0 ○テーブルの中身の表示 「kitta_hiroshimasales hiraya_yamaguchisales」テーブルに含まれていたデータを「sadachi_sales」テーブルに格納する mysql> select * from sadachika_shop.sadachi_sales; sada_name sada_count Banana 10 *kitta_hiroshimasales Melon 7 *kitta_hiroshimasales Orange 12 *kitta_hiroshimasales Apple 5 *kitta_hiroshimasales Strawberry 21 *hiraya_yamaguchisales オレンジが重複しているため、hira_nameから2項目が格納された Watermelon 3 *hiraya_yamaguchisales オレンジが重複しているため、hira_nameから2項目が格納された ○○上書きのプログラムを使用する例 ON DUPLICATE KEY UPDATE句 一度「sadachi_sales」テーブルのデータを全て削除 ○カラムのデータを削除する mysql> delete from sadachika_shop.sadachi_sales where sada_name >= 'Banana', 'Melon', 'Orange', 'Apple', 'Strawberry';*ERROR mysql> delete from sadachika_shop.sadachi_sales where sada_name >= 'Watermelon'; Query OK, 1 rows affected (0.05 sec) mysql> delete from sadachika_shop.sadachi_sales where sada_name >= 'Banana'; Query OK, 4 rows affected (0.03 sec)*なぜ4なの? mysql> delete from sadachika_shop.sadachi_sales where sada_name >= 'Melon'; Query OK, 0 rows affected (0.00 sec)*なぜ0なの? ○テーブルの中身の表示 「kitta_hiroshimasales hiraya_yamaguchisales」テーブルに含まれていたデータを「sadachi_sales」テーブルに格納する mysql> select * from sadachika_shop.sadachi_sales; sada_name sada_count Apple 5 *kitta_hiroshimasales mysql> delete from sadachika_shop.sadachi_sales where sada_name >= 'Apple'; Query OK, 1 rows affected (0.03 sec) ○テーブルの中身の表示 mysql> select * from sadachika_shop.sadachi_sales; Empty set (0.00 set) ○他のテーブルから、本家のテーブルに値を格納する 参照するのは2項目のカラム(kit_name kit_count) mysql> insert into sadachika_shop.sadachi_sales select kit_name, kit_count from sadachika_shop.kitta_hiroshimasales; ↑格納する本家テーブル名 ↑分家カラム↑分家カラム ↑分家テーブル名 Query OK, 4 rows affected (0.06 sec) Records: 4 Duplicates: 0 Warnings: 0 ○テーブルの中身の表示 「kitta_hiroshimasales」テーブルに含まれていたデータが「sadachi_sales」テーブルに格納 mysql> select * from sadachika_shop.sadachi_sales; sada_name sada_count Banana 10 Melon 7 Orange 12 Apple 5 4 rows affected (0.00 sec) ○○○ON DUPLICATE KEY UPDATE句を使用して、重複する値の上書き格納を行なう mysql> insert into sadachika_shop.sadachi_sales select hira_name, hira_count from sadachika_shop.hiraya_yamaguchisales -> on duplicate key update sada_count=sada_count+values(sada_count); ↑本家 ↑本家 ↑本家 Query OK, 6 rows affected (0.01 sec) なんで6? Records: 4 Duplicates: 0 Warnings: 0 上書き一覧 'Orange', 12, 2009-10-18 *kitta_hiroshimasales ↓ 'Orange', 4, 2009-10-02 *hiraya_yamaguchisales 重複している ↓ 'Orange', 7, 2009-10-07 *hiraya_yamaguchisales 重複している 合計 12 + 4 + 7 = 23 ○テーブルの中身の表示 「hiraya_yamaguchisales」テーブルに含まれていたデータが「sadachi_sales」テーブルに格納 mysql> select * from sadachika_shop.sadachi_sales; sada_name sada_count Banana 10 *kitta_hiroshimasales Melon 7 *kitta_hiroshimasales Orange 23 *合計 12 + 4 + 7 = 23 Apple 5 *kitta_hiroshimasales Strawberry 21 *hiraya_yamaguchisales Watermelon 3 *hiraya_yamaguchisales お手本? mysql> insert into sales select name, count from osaka_sales -> on duplicate key update count=sales.count+values(count); ↑? ○○もう一度重複の値を上書きしてみる Orange 23 ↓ Orange 4 ↓ Orange 7 ↓ 34 Strawberry 21 ↓ Strawberry 21 ↓ 42 Watermelon 3 ↓ Watermelon 3 ↓ 6 ○○○ON DUPLICATE KEY UPDATE句を使用して、重複する値の上書き格納を行なう mysql> insert into sadachika_shop.sadachi_sales select hira_name, hira_count from sadachika_shop.hiraya_yamaguchisales -> on duplicate key update sada_count=sada_count+values(sada_count); Query OK, 8 rows affected (0.02 sec) なんで8? Records: 4 Duplicates: 4 Warnings: 0 ○テーブルの中身の表示 「hiraya_yamaguchisales」テーブルに含まれていたデータが「sadachi_sales」テーブルに格納 mysql> select * from sadachika_shop.sadachi_sales; sada_name sada_count Banana 10 *kitta_hiroshimasales Melon 7 *kitta_hiroshimasales Orange 34 *合計 12 + 4 + 7 + 4 + 7 = 34 Apple 5 *kitta_hiroshimasales Strawberry 42 *合計 21 + 21 = 42 hiraya_yamaguchisales Watermelon 6 *合計 3 + 3 = 6 hiraya_yamaguchisales 6 rows affected (0.00 sec) ○分家カラムを作成(suzu_okayamasales) mysql> create table sadachika_shop.suzu_okayamasales(su_name varchar(20), su_count int, su_d date); Query OK, 0 rows affected (0.13 sec) ○入力 全てのカラムに値を格納するので省略文を用いた。 mysql> insert into sadachika_shop.suzu_okayamasales values('Orange', 14, '2013-07-19') ,('Banana', 15, '2013-07-19'), ('Banana', 25, '2013-07-19'), ->('Melon', 42, '2013-07-19'), ('Apple', 42, '2013-07-19'), ('Strawberry', 4, '2013-07-19'), ('Watermelon', 30, '2013-07-19'), ->('Watermelon', 9, '2013-07-19'); ↑日付は同じだが重複には関係ない カラム名su_dの値は本家に格納しないからだ Query OK, 8 rows affected (0.05 sec) Records: 8 Duplicates: 0 Warnings: 0 ○テーブルの中身の表示 mysql> select * from sadachika_shop.suzu_okayamasales; zu_name zu_count su_d Orange 14 2013-07-19 Banana 15 2013-07-19 Banana 25 2013-07-19 Melon 42 2013-07-19 Apple 42 2013-07-19 Strawberry 4 2013-07-19 Watermelon 30 2013-07-19 Watermelon 9 2013-07-19 8 rows affected (0.00 sec) ○○○ON DUPLICATE KEY UPDATE句を使用して、重複する値の上書き格納を行なう mysql> insert into sadachika_shop.sadachi_sales select su_name, su_count from sadachika_shop.suzu_okayamasales -> on duplicate key update sada_count=sada_count+values(sada_count); Query OK, 16 rows affected (0.01 sec) Records: 8 Duplicates: 8 Warnings: 0 ○上書き一覧 Banana 10 15 + 25 = 50 Melon 7 + 42 = 49 Orange 34 + 14 = 48 Apple 5 + 42 = 47 Strawberry 42 + 4 = 46 Watermelon 6 + 30 + 9 = 45 ○テーブルの中身の表示 「suzu_okayamasales」テーブルに含まれていたデータを「sadachi_sales」テーブルに格納した mysql> select * from sadachika_shop.sadachi_sales; sada_name sada_count Banana 50 Melon 49 Orange 48 Apple 47 Strawberry 46 Watermelon 45 6 rows affected (0.00 sec) おさらい ○カラムを削除する場合 mysql> alter table sadachika_shop.sadachi_cart drop column sada_t; ○アップデート ↓db名 ↓テーブル名 ↓カラム名 ↓更新・格納するデータ ↓基準のカラムの桁 mysql> update sadachika_shop.sadachi_results set sada_name = '佐藤' where sada_name = '橘高'; mysql> update sadachika_shop.sadachi_results set sada_id = 4 where sada_id = 3; mysql> update sadachika_shop.sadachi_results set sada_id = 3 where sada_id = 2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 ○primary keyを削除 mysql> alter table sadachika_shop.sadachi_results DROP PRIMARY KEY;
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。