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