4

テーブルにいくつかの行を更新する必要があります。更新する行がテーブルに存在しない場合は、その行を挿入する必要があります。一意のキーを使用できないため、ONの重複するKEYUPDATEでは使用できません

私はこのようなことを達成しなければなりません

DECLARE count DOUBLE;
SELECT count(uid) 
INTO   count 
FROM   Table 
WHERE  column1  ='xxxxx'
 AND   column2='xxxxx';

IF (count=0)
THEN
    --peform insert
ELSE
    --perform update
END IF

これは高性能アプリケーション用です。何かアイデアはありますか?コードレベルまたはクエリレベル

参考:データベースはMysqlです

4

5 に答える 5

3

一時テーブルを使用できます。

  1. データを一時テーブルに入れる
  2. JOIN を介して「他の」テーブルの更新を行う
  3. 一致するデータを一時テーブルから削除します
  4. 一時テーブルの残りのものをメイン テーブルに挿入します。

データが大量にある場合、これはレコードごとに行うよりも高速です。

于 2013-01-11T11:25:34.420 に答える
1

これは私たちが使用するストア プロシージャであり、おそらくあなたにも当てはまるでしょう。

if not exists (select 1 from Table  where column1  ='xxxxx' AND   column2='xxxxx')
        insert into Table ( column1,column2)
        values ( @xxxx,xxxxx)
else 
    update Table
于 2013-01-11T11:27:38.183 に答える
0
BEGIN TRAN
IF EXISTS ( SELECT  *
        FROM Table WITH ( UPDLOCK, SERIALIZABLE )
        WHERE CONDITION) 
BEGIN
    UPDATE Table SET SOMETHING WHERE CONDITION
END
ELSE 
BEGIN
    INSERT INTO Table(Field1,....) VALUES  (Value1,..... )
END
COMMIT TRAN

注: トランザクションは非常に優れていますが、IF EXISTS の使用は、複数のクエリによる挿入/更新の場合には適していません。

于 2013-01-11T11:32:06.547 に答える
0

EXISTSを使用するか、行がすでに存在するかどうかを知るために、> 0 の場合はサブ選択の数を確認できます

于 2013-01-11T11:32:30.133 に答える
-1

便利な REPLACE ステートメントが見つかるかもしれません。その構文はhere で説明されています。

于 2013-01-11T11:22:28.183 に答える