回答:
最初に答えるには:
UPDATE Orders SET Quantity = Quantity + 1 WHERE ...
2番目に答えるには:
これを行うにはいくつかの方法があります。データベースを指定しなかったので、MySQLを想定します。
INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2REPLACE INTO table SET x=1, y=2どちらもあなたの質問に対応できます。ただし、最初の構文では、(2番目の構文のように)単にレコードを置き換えるのではなく、レコードを更新する柔軟性が高くなります。
両方が存在するためには、一意のキーが定義されている必要があることに注意してください...
最初の質問に対する単一ステップの回答は、次のようなものを使用することです。
update TBL set CLM = CLM + 1 where key = 'KEY'
それは非常に単一の命令による方法です。
2番目の質問については、目的のUPSERT結果を得るために、DBMS固有のSQL体操(など)に頼る必要はありません。特定のDBMSを必要としない、更新または挿入を行うための標準的な方法があります。
try:
insert into TBL (key,val) values ('xyz',0)
catch:
do nothing
update TBL set val = val + 1 where key = 'xyz'
つまり、最初に作成を試みます。すでにそこにある場合は、エラーを無視してください。それ以外の場合は、値0で作成します。
次に、更新が正常に機能するかどうかを実行します。
これは単一の指示ではありませんが、驚くことに十分長い間、私たちが長い間成功してきた方法です。
私の理解が正しければ、更新はかなり単純なはずです。私は次のようにします。
UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0
すべての行ではなく単一の行を更新するには、追加のフィルターが必要になる場合があります。
挿入の場合、レコードに関連する一意のIDをローカルにキャッシュし、このキャッシュと照合して挿入するかどうかを決定できます。代替のアプローチは、常に挿入してPK違反エラーをチェックし、これは冗長な挿入であるため無視します。
@dotjoe @@ rowcountを更新して確認し、その後に挿入を行う方が安上がりです。
例外は高価であり、更新はより頻繁です
提案:DALでパフォーマンスを高めたい場合は、更新する行の一意のIDでフロントエンドパスを作成します(ヌル挿入の場合)。
DALはCRUDでなければならず、ステートレスであることを心配する必要はありません。
ステートレスにすると、適切なインデックスを使用すると、次のSQLと1のステートメントの違いがわかりません。IF(トップ1を選択*フォームxでPK = @ IDを挿入)その他の更新を挿入