MySQLでは、ログインなどのフィールドがある場合、sqlコマンド内でそのフィールドを1ずつ更新するにはどうすればよいですか?
FirstName、lastName、およびloginsを作成するINSERTクエリを作成しようとしています。ただし、firstNameとlastNameの組み合わせがすでに存在する場合は、ログインを1増やします。
そのため、テーブルは次のようになります。
firstName----|----lastName----|----logins
John Jones 1
Steve Smith 3
私は、実行時に新しい人(つまり、Tom Rogers)を挿入するか、John Jonesが名前として使用されていた場合はログインを増やすコマンドを実行しています。
単純な増分でトリックを行う必要があります。
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
(firstName、lastName)PRIMARY KEYを安全に作成できる場合、または少なくともUNIQUEキーをそれらに設定できる場合、これを行うことができます。
INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;
それができない場合は、その主キーを最初にフェッチする必要があるため、1つのクエリで目的を達成できるとは思いません。
あなたがしようとしていることを言わなかったが、他の答えへのコメントでそれを十分にほのめかした。おそらく自動インクリメント列を探していると思います
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を通知する関数があります。
私はMySQLの専門家ではありませんが、おそらくトリガーを調べる必要があります。挿入する前。トリガーでは、元のテーブルで選択クエリを実行でき、何かが見つかった場合は、新しい値を挿入する代わりに、行「ログイン」を更新するだけです。しかし、これはすべて実行しているMySQLのバージョンに依存します。
これは、ON DUPLICATE KEY UPDATE
、注意これはではなく常に安全であるということを示唆する上記の回答の多くの脚注です。単一のサーバーを超えて成長することを計画している場合、これを回避し、2つのクエリを使用して、1つは存在を確認し、もう1つはeither行が存在する場合はUPDATE
、存在しない場合はINSERT
。