web-dev-qa-db-ja.com

データベースフィールドを1増やす

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

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

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

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

John               Jones             1
Steve              Smith             3

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

138
Matt

エントリの更新:

単純な増分でトリックを行う必要があります。

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

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

以前に既存の行を更新する場合、またはまだ存在しない場合は挿入する場合は、 REPLACE syntax または INSERT...ON DUPLICATE KEY UPDATE オプションを使用できます(As- ロブ・ヴァン・ダム彼の答え )で実証されています。

新しいエントリの挿入:

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

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable
260
Sampson

(firstName、lastName)PRIMARY KEYを安全に作成できる場合、または少なくともUNIQUEキーをそれらに設定できる場合、これを行うことができます。

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

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

68
Rob Van Dam

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

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
Ken Bloom

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

2
Serg Gulko

これは、ON DUPLICATE KEY UPDATE注意これはではなく常に安全であるということを示唆する上記の回答の多くの脚注です。単一のサーバーを超えて成長することを計画している場合、これを回避し、2つのクエリを使用して、1つは存在を確認し、もう1つはeither行が存在する場合はUPDATE、存在しない場合はINSERT

1
oucil