もしカラム内で値が重複した場合の、その後の値を上書き処理するケース free69

Thursday,July,18,2013

お手本
INSERT INTO tbl_name (col_name1, col_name2, ...)
  VALUES (value1, value2, ...)
  ON DUPLICATE KEY UPDATE col_name_x=value_x, col_name_y=value_y, ...;

○テーブルを作る
mysql> create table sadachika_shop.sadachi_usertbl(sada_user varchar(20) unique default '値がありません', sada_visit int default 0, sada_browse int default 0);        *カラム名sada_user VARCHAR型 ユニーク デフォルト設定, カラム名visit INT型 デフォルト設定0, カラム名sada_browse INT型 デフォルト設定0,
Query OK 0 roes affected (2.28 sec)                                       *↑ユニーク制約を設定したので重複した値は格納できない

○テーブルの構造を見る
mysql> show columns from sadachika_shop.sadachi_usertbl;
Field        Type         Null   Key    Default    Extra
sada_user    varchar(20)  YES    UNI    値がありません          *Default項目が'値がありません' 
sada_visit   int(11)      YES           0                       *Default項目が 0
sada_browse  int(11)      YES           0                       *Default項目が 0
3 row in set (0.48 sec) 

○作成したテーブルの定義を確認してみる
mysql> show create table sadachika_shop.sadachi_usertbl\G
*********** 1. row **************
       Table: sadachi_usertbl
Create Table: CREATE TABLE 'sadachi_usertbl'(
 'sada_user' varchar(20) DEFAULT '値がありません',   *Default項目が'値がありません' 
 'sada_visit' int(11) DEFAULT '0',                   *Default項目が 0     
 'sada_browse' int(11) DEFAULT '0',                  *Default項目が 0
 UNIQUE KEY 'sada_user' (sada_user)                  *UNIQUE KEY項目 sada_user
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.06 sec) 



○値を入力する
mysql> insert into sadachika_shop.sadachi_usertbl values('Sadachika', 1, 5)                    *カラム名が重複する場合は、sada_visitへ+1, sada_browseへ+5を上書きする。
    -> on duplicate key update sada_visit=sada_visit+1, sada_browse=sada_browse+5;             重複しなければ、下の段の式は使用されない。
Query OK 1 roes affected (0.20 sec)

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_usertbl;
sada_user    sada_visit   sada_browse
Sadachika             1             5
1 roes affected (0.03 sec)

○値を入力する
mysql> insert into sadachika_shop.sadachi_usertbl values('Sadachika', 1, 7)                    *カラム名が重複する場合は、sada_visitへ+1, sada_browseへ+7を上書きする。
    -> on duplicate key update sada_visit=sada_visit+1, sada_browse=sada_browse+7;             *重複していれば、下の段のプログラムが実行され上書きされる。
Query OK 1 roes affected (0.20 sec)

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_usertbl;
sada_user    sada_visit   sada_browse
Sadachika             2            12         *重複していたので下の段のプログラムが作動した
1 roes affected (0.02 sec)

○値を入力する
mysql> insert into sadachika_shop.sadachi_usertbl values('Sadachika', 1, 100)                         *カラム名が重複する場合は、sada_visitへ+1, sada_browseへ+7を上書きする。
    -> on duplicate key update sada_visit=sada_visit+1, sada_browse=sada_browse+values(sada_browse);  *values(sada_browse)は、100を表している。入力すべきカラムの値を参照している
Query OK 2 roes affected (0.03 sec)

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_usertbl;
sada_user    sada_visit   sada_browse
Sadachika             3           112         *重複していたので下の段のプログラムが作動した
1 roes affected (0.02 sec)

○値を入力する                                        ↓1つのカラムにだけ入力
mysql> insert into sadachika_shop.sadachi_usertbl(sada_user) values('Hirayama')               *デフォルト機能をテストする  
    -> on duplicate key update sada_visit=sada_visit+1, sada_browse=sada_browse+8;            重複していれば下のプログラムが実行されるが、カラム名sada_name へは初めての値が格納される為使用されない。
Query OK 1 roes affected (0.06 sec)

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_usertbl;
sada_user    sada_visit   sada_browse
Sadachika             3           112
Hirayama              0             0         *重複していないので上段のプログラムが作動し、下段は使用されなかった。通常の処置である
2 roes affected (0.00 sec)

○値を入力する                                        ↓1つのカラムにだけ入力
mysql> insert into sadachika_shop.sadachi_usertbl(sada_visit) values(66)                      *デフォルト機能をテストする  
    -> on duplicate key update sada_visit=sada_visit+1, sada_browse=sada_browse+8;            重複していれば下のプログラムが実行されるが、カラム名sada_name へは初めての値が格納される為使用されない。
Query OK 1 roes affected (0.03 sec)

○テーブルの中身の表示 
mysql> select * from sadachika_shop.sadachi_usertbl;
sada_user    sada_visit   sada_browse
Sadachika             3           112
Hirayama              0             0
値がありません       66             0         *重複していないので上段のプログラムが作動し、下段は使用されなかった。通常のNULL、とデフォルト処置である
3 roes affected (0.03 sec)



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

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

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