2014-01-09 45 views
6

我有一個表與3個通用鍵也是外鍵。這是我的查詢 -SQL如果存在更新其他插入不工作

 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'在DUPLICATE KEY UPDATE上? – Barmar

+0

@Barmar我試過,但它不起作用。文件說,它會導致錯誤存在多個鍵 – user983983

+0

在MySQL中有一個'替換'。你可以使用這 – 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

選擇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 Oracle提供下面的例子:

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. 必須有END IF爲每IF聲明;
  2. 我所以要根據documentation創建我的程序與mysql

如果你使用MySQL的客戶程序定義包含分號存儲的程序,一個問題出現了。默認情況下,mysql本身將分號識別爲語句分隔符,因此您必須臨時重新定義分隔符以使mysql將整個存儲的程序定義傳遞給服務器。

0

儘量把然後開始 之前也嘗試把如果最後一行

希望在這之後的工作:

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** 
相關問題