文字列から2つの整数にマップするテーブルを想像してください。キーがテーブルにない場合は、新しい行を挿入するか、整数を加算して既存の行を更新したいとします。(key, oldx+x, oldy+y)
私はこれをたくさん行うだろうし、最初にSELECT
の行が存在するかどうかをチェックする代わりにINSERT
またはUPDATE
のように1回の操作でこれを行うことができますか?SQLで挿入または更新
私はSQLを初めて使いました。効率的な方法でこれを行う方法を理解できません。
文字列から2つの整数にマップするテーブルを想像してください。キーがテーブルにない場合は、新しい行を挿入するか、整数を加算して既存の行を更新したいとします。(key, oldx+x, oldy+y)
私はこれをたくさん行うだろうし、最初にSELECT
の行が存在するかどうかをチェックする代わりにINSERT
またはUPDATE
のように1回の操作でこれを行うことができますか?SQLで挿入または更新
私はSQLを初めて使いました。効率的な方法でこれを行う方法を理解できません。
SQLiteはINSERT OR REPLACE
をサポートしています。ほとんどの人が考えるよりも注意が必要です。詳細については、this SO answerを参照してください。置き換え中にカスケード削除が発生する可能性があることに注意してください。
データベースがどのようにしてUpsertをサポートしているかわかりません。両方を行う
は動作します:
UPDATE TABLE SET x=x+?, y=y+? WHERE key = ?; -- will do nothing if key not found
INSERT INTO TABLE (key, x, y)
SELECT ?, ?, ?
WHERE NOT EXISTS (SELECT * FROM TABLE WHERE key = ?); -- will do nothing if key found
は一つだけでは今までに、テーブル内のデータに影響を及ぼします。
-- Insert record with key=k if it does not exist yet.
-- the zero's could also be handled by appropiate defaults for oldx,oldy
INSERT INTO tab (key, oldx, oldy) select k,0,0
WHERE NOT EXISTS (SELECT 1 FROM tab where key=k)
;
UPDATE tab
SET oldx=oldx+y, oldy=oldy+y
WHERE key = k
;
これは私のためには機能しません。 SELECT WHERE NOT EXISTSは、最後のWHERE句と一致しないデータベースの各行に対して行を戻しています。その結果、新しいレコードを複数回挿入しています。 – Michael
どのDBMSを使用していますか? PostgreSQL、Oracle、Firebird、DB2、SQL Server、MySQL? –
SQLite + Perl DBI –