分家のテーブルの値を本家のテーブルに移行するときに同一の値がある場合、
上書きするカラムを設定をする。 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; 




* 参考にしたサイトは→ こちら です。

これは赤色の文字例です。

これは青色の文字例です。