web-dev-qa-db-ja.com

mysqlはKEYではなく重複したFIELDに挿入します

------------------------------------- 
 | user_id | user_name | user_visits | 
 ------------------------------------- 
 | 1 | foo | 5 | 
 ------------------------------------- 
 | 2 |バー| 12 | 
 -------------------------------------

user_id:自動increament、user_visits:デフォルト1

INSERT INTO table(user_name)VALUES( 'baz')、( 'bar')、( 'qux');

上記のステートメントはもちろん、結果として3つの新しいレコードを挿入します。

------------------------------------- 
 | user_id | user_name | user_visits | 
 ------------------------------------- 
 | 1 | foo | 5 | 
 ------------------------------------- 
 | 2 |バー| 12 | 
 ------------------------------------- 
 | 3 |バズ| 1 | 
 ------------------------------------- 
 | 4 |バー| 1 | 
 ------------------------------------- 
 | 5 | qux | 1 | 
 -------------------------------------

しかし、私が達成しようとしているのは次のとおりです。

------------------------------------- 
 | user_id | user_name | user_visits | 
 ------------------------------------- 
 | 1 | foo | 5 | 
 ------------------------------------- 
 | 2 |バー| 13 | 
 ------------------------------------- 
 | 3 |バズ| 1 | 
 ------------------------------------- 
 | 4 | qux | 1 | 
 -------------------------------------

文字通り、

フィールドuser_nameが存在する場合は、user_visitsを更新し、存在しない場合は、新しいレコードを挿入します。

単一の挿入ステートメントでこれを達成することは可能ですか?

19
pepsi600

ユーザー名フィールドのキーを作成してから、INSERT ON DUPLICATEクエリを使用して列の値を更新する必要があります。

たとえば、クエリは次のようにする必要があります。

   INSERT INTO table (user_name) VALUES ('baz'), ('bar'), ('qux') 
   ON DUPLICATE KEY UPDATE user_visits=user_visits+1;

詳細については、 http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html をご覧ください。

5
Vijay

確かにありますが、それはあなたのinsertステートメントとは何の関係もありません。 user_name列に一意のインデックスを追加する必要があります。

create unique index user_name_idx on yourtable (user_name);

その後、カウントを追跡するコードで、挿入を実行するか更新を実行するかを決定する必要があります。

4
Wes

INSERTステートメントをそのままにして、特別なアクションを処理するトリガーを実装することができます。

参照: トリガーの概要

0
timbooo