1

主キーが重複している場合、代わりに UPDATE を使用する必要がある単純な INSERT クエリがあります。MySQL ではこれは簡単に思えますが、Oracle では MERGE を使用する必要があるようです。

私が見つけた MERGE のすべての例には、ある種の「ソース」テーブルと「ターゲット」テーブルがありました。私の場合、ソースとターゲットは同じテーブルです。独自のクエリを作成するための例を理解できませんでした。

MERGE が唯一の方法ですか、それとももっと良い解決策がありますか?

INSERT INTO movie_ratings
VALUES (1, 3, 5)

基本的にはこれで、主キーは最初の 2 つの値であるため、更新は次のようになります。

UPDATE movie_ratings
SET rating = 8
WHERE mid = 1 AND aid = 3

主キーが重複している場合にのみ、INSERT が呼び出されたときに UPDATE ステートメントを自動的に実行するトリガーを使用することを考えました。この方法で何か問題はありますか?ただし、トリガーを理解しようとして自分で行うのに苦労しているため、トリガーの助けが必要です。

4

3 に答える 3

11

MERGE は、標準 SQL の「必要に応じて INSERT または UPDATE を実行する」ステートメントであり、おそらく Oracle SQL でも同様です。

はい、マージ元の「テーブル」が必要ですが、ほぼ確実にそのテーブルをその場で作成できます。

 MERGE INTO Movie_Ratings M
       USING (SELECT 1 AS mid, 3 AS aid, 8 AS rating FROM dual) N
          ON (M.mid = N.mid AND M.aid = N.aid)
       WHEN     MATCHED THEN UPDATE SET M.rating = N.rating
       WHEN NOT MATCHED THEN INSERT(  mid,   aid,   rating)
                             VALUES(N.mid, N.aid, N.rating);

(構文は検証されていません。)

于 2011-01-04T00:46:24.493 に答える
2

これを行う典型的な方法は、

  • INSERT を実行して DUP_VAL_ON_INDEX をキャッチし、代わりに UPDATE を実行する
  • 最初に UPDATE を実行し、SQL%Rows = 0 の場合は INSERT を実行します

同じテーブルで別の操作を行うテーブルにトリガーを書き込むことはできません。これにより、Oracle エラー (テーブルの変更) が発生しています。

于 2011-01-04T00:31:06.007 に答える
0

私は T-SQL 派ですが、この場合のトリガーは適切な解決策ではありません。ほとんどのトリガーは、適切な解決策ではありません。T-SQL では単純に IF EXISTS (SELECT * FROM dbo.Table WHERE ...) を実行しますが、Oracle ではカウントを選択する必要があります...

DECLARE 
  cnt NUMBER;
BEGIN
  SELECT COUNT(*)
   INTO cnt
    FROM mytable
  WHERE id = 12345;

  IF( cnt = 0 )
  THEN
    ...
  ELSE
    ...
  END IF;
END;

この場合、MERGE が必要なようです。

MERGE INTO movie_ratings mr
USING (
  SELECT rating, mid, aid
  WHERE mid = 1 AND aid = 3) mri
ON (mr.movie_ratings_id = mri.movie_ratings_id)

WHEN MATCHED THEN
  UPDATE SET mr.rating = 8 WHERE mr.mid = 1 AND mr.aid = 3

WHEN NOT MATCHED THEN
  INSERT (mr.rating, mr.mid, mr.aid)
  VALUES (1, 3, 8) 

私が言ったように、私は T-SQL 派ですが、ここでの基本的な考え方は、movie_rating テーブルをそれ自体に対して "結合" することです。「存在する場合」の例を使用してもパフォーマンスが低下しない場合は、読みやすくするために使用します。

于 2011-01-04T00:53:24.567 に答える