2011-09-17 16 views
2

文字列から2つの整数にマップするテーブルを想像してください。キーがテーブルにない場合は、新しい行を挿入するか、整数を加算して既存の行を更新したいとします。(key, oldx+x, oldy+y)私はこれをたくさん行うだろうし、最初にSELECTの行が存在するかどうかをチェックする代わりにINSERTまたはUPDATEのように1回の操作でこれを行うことができますか?SQLで挿入または更新

私はSQLを初めて使いました。効率的な方法でこれを行う方法を理解できません。

+0

どのDBMSを使用していますか? PostgreSQL、Oracle、Firebird、DB2、SQL Server、MySQL? –

+0

SQLite + Perl DBI –

答えて

4

SQLiteはINSERT OR REPLACEをサポートしています。ほとんどの人が考えるよりも注意が必要です。詳細については、this SO answerを参照してください。置き換え中にカスケード削除が発生する可能性があることに注意してください。

1

データベースがどのようにしてUpsertをサポートしているかわかりません。両方を行う

2

は動作します:

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 

は一つだけでは今までに、テーブル内のデータに影響を及ぼします。

1
-- 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 
    ; 
+0

これは私のためには機能しません。 SELECT WHERE NOT EXISTSは、最後のWHERE句と一致しないデータベースの各行に対して行を戻しています。その結果、新しいレコードを複数回挿入しています。 – Michael