もしカラム内で値が重複した場合の、その後の値を上書き処理するケース 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)
* 参考にしたサイトは→ こちら です。
これは赤色の文字例です。
これは青色の文字例です。