174

MySQLでは、ログインなどのフィールドがある場合、SQLコマンド内でそのフィールドを1ずつ更新するにはどうすればよいですか?

firstName、lastName、およびログインを作成するINSERTクエリを作成しようとしています。ただし、firstNameとlastNameの組み合わせがすでに存在する場合は、ログインを1つ増やします。

したがって、テーブルは次のようになります。

firstName----|----lastName----|----logins

John               Jones             1
Steve              Smith             3

私は、実行時に新しい人(つまり、Tom Rogers)を挿入するか、John Jonesが使用された名前である場合は、ログインを増やすコマンドを実行しています。

4

5 に答える 5

325

エントリの更新:

単純な増分でうまくいくはずです。

UPDATE mytable 
  SET logins = logins + 1 
  WHERE id = 12

新しい行を挿入するか、すでに存在する場合は更新します。

既存の行を更新する場合、またはまだ存在しない場合は挿入する場合は、REPLACE構文またはINSERT...ON DUPLICATE KEY UPDATEオプションを使用できます(Rob Van Damが彼の回答で示したように)。

新しいエントリの挿入:

または多分あなたはのようなものを探していますINSERT...MAX(logins)+1か?基本的に、次のようなクエリを実行します。特定のニーズに応じて、おそらくもう少し複雑になります。

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable
于 2010-05-04T04:41:22.420 に答える
74

(firstName、lastName)を安全にPRIMARY KEYにするか、少なくともUNIQUEキーを付けることができる場合は、次のようにすることができます。

INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;

それができない場合は、最初にその主キーをフェッチする必要があるため、1回のクエリで目的を達成することはできないと思います。

于 2010-05-04T05:19:35.640 に答える
3

これは、上記の多くの回答の脚注であり、ON DUPLICATE KEY UPDATEこれは常にレプリケーションセーフであるとは限らないことに注意してください。したがって、単一のサーバーを超えて拡張することを計画している場合は、これを避けて2つのクエリを使用することをお勧めします、1つは存在を確認し、2つ目は行が存在する場合と存在しない場合のいずれかです。 UPDATEINSERT

于 2017-01-31T17:23:20.120 に答える
2

あなたは自分がやろうとしていることを言っていませんでしたが、他の答えへのコメントでそれを十分にほのめかしました。おそらく自動インクリメント列を探していると思います

create table logins (userid int auto_increment primary key, 
  username varchar(30), password varchar(30));

その場合、挿入時に特別なコードは必要ありません。ただ

insert into logins (username, password) values ('user','pass');

MySQL APIには、クライアントコードでこのステートメントを実行したときに作成されたユーザーIDを通知する関数があります。

于 2010-05-04T05:06:38.590 に答える
2

私はMySQLの専門家ではありませんが、おそらくINSERTの前などのトリガーを調べる必要があります。トリガーでは、元のテーブルに対してselectクエリを実行できます。何かが見つかった場合は、新しい値を挿入する代わりに、行'logins'を更新するだけです。ただし、これはすべて、実行しているMySQLのバージョンによって異なります。

于 2010-05-04T05:30:53.387 に答える