2014-01-09 19 views
6

私は外部キーである3つの汎用キーを持つテーブルを持っています。これは私のクエリです -sqlが存在する場合update else insert not working

 IF (EXISTS(SELECT * FROM table1 WHERE col_1 =4)) 
     BEGIN 
     UPDATE table1 
    SET col_2 = 3, 
    col_3 = 100 
     WHERE col_1 = 4 
     END 
     ELSE 
     BEGIN 
     INSERT INTO table1 
    (col_1, col_2, col_3) 
     VALUES(4, 2, 27) 
     END 

これは私に構文エラーです。エンジンはInnoDBを使用しました。照合:utf8_swedish_ci

は、私もこれを試してみました -

   INSERT INTO table1 
    (col1, col2, col3) 
    VALUES 
    (:val1, :val2, :val3) 
    ON DUPLICATE KEY UPDATE 
    col2=:val2, 
    col3=:val3 

これが正常に動作してのみ、重複キーを持つのinspite行を挿入しません。

+1

あなただけの 'と' INSERT'をしないのはなぜON DUPLICATE KEY UPDATE'? – Barmar

+0

@Barmar私はそれを試みたが、それは働かない。ドキュメントには、複数のキーがある場合にエラーが発生すると言われています – user983983

+0

mysqlには 'replace'があります。これを使うことができます – devanand

答えて

0

はこれを試してみてください:

IF EXISTS (SELECT 1 FROM table1 WHERE col_1 = '4') THEN 
BEGIN 
    UPDATE assignment_question 
    SET col_2 = '3', col_3 = '100' 
    WHERE col_1 = '4'; 
END 
ELSE 
BEGIN 
    INSERT INTO table1 (col_1, col_2, col_3) 
    VALUES (4, 2, 27); 
END 
+0

select 1 .... ??? – user983983

+0

@ user983983 1の代わりに '*'を使うことができますが、パフォーマンスのために '*'は使われません。どちらも同じように動作します –

+0

'*'がうまくいけば、なぜこれが問題を解決すると思いますか? –

0

あなたは、このことができます

SELECT COUNT(*) INTO COUNT FROM TABLE1 WHERE COL_1 = '4' 
IF (COUNT > 0) THEN 
BEGIN 
UPDATE TABLE1 SET COL_2 = '3', COL_3 = '100' WHERE COL_1 = '4'; 
END 
ELSE 
BEGIN 
INSERT INTO TABLE1 (COL_1, COL_2, COL_3) VALUES (4, 2, 27); 
END 

希望が存在する場合に代わるものとして、以下のコードを試すことができます。

0

「既存のレコードがある場合は更新/削除するか、レコードが存在しない場合は新しい行を挿入する」シナリオでは、Oracleが提供するMERGEコマンドを使用できます。

リンク:https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm

PSBオラクルが提供する以下の例:

CREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100); 

INSERT INTO bonuses(employee_id) 
    (SELECT e.employee_id FROM employees e, orders o 
    WHERE e.employee_id = o.sales_rep_id 
    GROUP BY e.employee_id); 

SELECT * FROM bonuses; 

EMPLOYEE_ID  BONUS 
----------- ---------- 
     153  100 
     154  100 
     155  100 
     156  100 
     158  100 
     159  100 
     160  100 
     161  100 
     163  100 

MERGE INTO bonuses D 
    USING (SELECT employee_id, salary, department_id FROM employees 
    WHERE department_id = 80) S 
    ON (D.employee_id = S.employee_id) 
    WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01 
    DELETE WHERE (S.salary > 8000) 
    WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus) 
    VALUES (S.employee_id, S.salary*0.1) 
    WHERE (S.salary <= 8000); 

EMPLOYEE_ID  BONUS 
----------- ---------- 
     153  180 
     154  175 
     155  170 
     159  180 
     160  175 
     161  170 
     179  620 
     173  610 
     165  680 
     166  640 
     164  720 
     172  730 
     167  620 
     171  740 
0
DELIMITER // 
CREATE PROCEDURE p()                                          
BEGIN 
    IF EXISTS(SELECT * FROM table1 WHERE col_1 = 4) THEN 
     UPDATE table1 SET col_2 = 3, col_3 = 100 WHERE col_1 = 4; 
    ELSE 
     INSERT INTO table1 VALUES(4, 2, 27); 
    END IF; 
END// 
DELIMITER ; 

問題:

  1. すべてのIF文のEND IFがなければなりません。
  2. 私はそうdocumentationに応じmysqlと私の手順を作成しました:

あなたはセミコロン文字を含む格納されたプログラムを定義するためのmysqlのクライアントプログラムを使用している場合は、問題が発生します。デフォルトでは、mysqlはセミコロンを文の区切り文字として認識します。したがって、mysqlがストアドプログラム定義全体をサーバに渡すようにするには、区切り文字を一時的に再定義する必要があります。

0

試してもENDを入れてみてくださいTHEN前 をBEGIN置くためにIF最後の行

希望した後、この作品:

IF (EXISTS(SELECT * FROM table1 WHERE col_1 =4)) **THEN** 
    BEGIN 
    UPDATE table1 
SET col_2 = 3, 
col_3 = 100 
    WHERE col_1 = 4 
    END 
    ELSE 
    BEGIN 
    INSERT INTO table1 
(col_1, col_2, col_3) 
    VALUES(4, 2, 27) 
    END 
    **END IF**