------------------------------------- | 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を更新し、存在しない場合は、新しいレコードを挿入します。
単一の挿入ステートメントでこれを達成することは可能ですか?
ユーザー名フィールドのキーを作成してから、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 をご覧ください。
確かにありますが、それはあなたのinsert
ステートメントとは何の関係もありません。 user_name
列に一意のインデックスを追加する必要があります。
create unique index user_name_idx on yourtable (user_name);
その後、カウントを追跡するコードで、挿入を実行するか更新を実行するかを決定する必要があります。
INSERTステートメントをそのままにして、特別なアクションを処理するトリガーを実装することができます。
参照: トリガーの概要