0

プロジェクトの sql ステートメントに問題があります。コード

IF EXISTS (SELECT * FROM person_drug WHERE drug_id=3 AND person_id=1)
BEGIN
   UPDATE person_drug SET amount=3 WHERE drug_id=3 AND person_id=1
END
ELSE
BEGIN
   INSERT INTO person_drug VALUES (1,3,3)
END

私がそれを実行すると、私は得ました:

1064 - SQL 構文エラーにエラーがあります。

しかし、UPDATE,SELECT,INSERT上記のステートメントを個別に実行すると、エラーは発生しませんでした。何が問題になる可能性がありますか?

ありがとう

4

3 に答える 3

1

MySQL のフロー制御ステートメント ( IF/ELSE/WHILE) は、ストアド プロシージャまたは関数のコンテキストでのみ使用できます。対話型クエリでは機能しません。

最善の解決策は、適切なインデックス作成と一意性制約を利用することです。

で主キーまたは一意のインデックスが定義されている(drug_id, person_id)場合は、このアクション全体を 1 つのステートメントで使用および実行できます。ON DUPLICATE KEY UPDATE

/* key ensures uniqueness for drug_id, person_id */
ALTER TABLE person_drug ADD UNIQUE KEY (drug_id, person_id);

/* Then it's possible to use INSERT .. ON DUPLICATE KEY UPDATE */
INSERT INTO person_drug (drug_id, person_id, amount) 
  VALUES (3, 1, 3)
  ON DUPLICATE KEY UPDATE amount = VALUES(amount)
于 2013-03-05T19:33:28.613 に答える
0
    BEGIN
       IF EXISTS (SELECT * FROM person_drug WHERE drug_id=3 AND person_id=1)
       UPDATE person_drug SET amount=3 WHERE drug_id=3 AND person_id=1
    ELSE
       INSERT INTO person_drug VALUES (1,3,3)
    END IF;
于 2013-03-05T19:31:25.977 に答える
0

ストアドプロシージャを作成するということは、次のように実行できることを意味します。

GOでANSI_NULLSを設定GOでQUOTED_IDENTIFIERを設定

プロシージャの作成者

開始時

SET NOCOUNT ON;



IF EXISTS 
(SELECT * FROM person_drug WHERE drug_id=3 AND person_id=1)

BEGIN UPDATE person_drug SET amount = 3 WHERE Drug_id = 3 AND person_id = 1 END ELSE BEGIN INSERT INTO person_drug VALUES(1,3,3)

END end GO

于 2013-03-06T05:28:44.943 に答える