データベースフィールドを1ずつ増加


158

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

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

そのため、テーブルは次のようになります。

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

John               Jones             1
Steve              Smith             3

実行時に新しい人物(つまり、Tom Rogers)を挿入するか、John Jonesが使用した名前である場合はログインをインクリメントするコマンドの後にいます。

回答:


287

エントリの更新:

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

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

3
また、アプリケーションに合わせてWHERE句を追加してください。
BoltClock

まあ、本当に!!あなたがそれができるとは知りませんでした!!! それでこれはうまくいくでしょうか?INSERT IGNORE mytable(firstName、lastName、logins)VALUES(John、Smith、logins = logins + 1)
Matt

@マットいいえ、それはINSERTではなくUPDATEです。挿入を行う場合は、最大値を取得して1を追加する必要があります。
サンプソン

2
@マットあなたの質問は「それを1つ更新することについて」尋ねましたが、それが混乱を引き起こしました。私はあなたが別の解決策を探しているのではないかと思います。これは、私の最新の回答で参照しています。
サンプソン

1
申し訳ありません@ジョナサンの混乱のために..私はうまくいけば少し明確に.. thatsの、私の質問を更新しました
マット・

70

(firstName、lastName)を安全に主キーにできるか、少なくともそれらに一意キーを置くことができる場合、これを行うことができます:

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

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


1
64バイト以上の主キーは大きな提案ではありません
ジョンブラック

変数を使用すると、「1」の代わりに機能しますか?つまり、重複したキーの更新にログイン= logins + numLogins; (もちろん正しくフォーマットされています)
Matt

1
ON DUPLICATE KEY UPDATE完全に複製安全ではないことに注意してください!
oucil 2017年

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を通知する関数があります。


2

私はMySQLの専門家ではありませんが、おそらくBEFORE INSERTなどのトリガーを調べる必要があります。トリガーでは、元のテーブルで選択クエリを実行し、何かが見つかった場合は、新しい値を挿入するのではなく、単に「ログイン」行を更新します。ただし、これはすべて、実行しているMySQLのバージョンによって異なります。


2

これは、上記の使用を示唆して回答の数により脚注でON DUPLICATE KEY UPDATE用心これがあることをしないで、あなたがこれまで単一のサーバーを超えて成長を予定している場合、あなたはこれを回避し、2つのクエリを使用したいと思うので、常に複製安全、1つは存在を確認し、次に2番目は行が存在する場合と存在しない UPDATE場合のいずれかINSERTです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.