分家のテーブルの値を本家のテーブルに移行するときに同一の値がある場合、
上書きするカラムを設定をする。 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;
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。