2014-01-09 16 views
6

Ich habe eine Tabelle mit 3 generischen Schlüsseln, die auch Fremdschlüssel sind. Das ist meine Abfrage -sql wenn existiert Update sonst einfügen funktioniert nicht

 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 

Das gibt mir einen Syntaxfehler. Motor verwendet InnoDB. Collation: utf8_swedish_ci

Ich versuchte auch dies -

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

Dies funktioniert nicht richtig, und legen Sie nur die Zeilen trotz Nachschlüssel hat.

+1

Warum tun Sie nicht nur ein 'INSERT' mit' ON DUPLICATE KEY UPDATE? – Barmar

+0

@Barmar Ich habe das versucht, aber es funktioniert nicht. Dokumente sagten, dass es Fehler in der Anwesenheit von mehreren Schlüsseln – user983983

+0

in mysql gibt es eine 'ersetzen '. Sie können dies verwenden – devanand

Antwort

0

Versuchen Sie folgendes:

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

wählen Sie 1 .... ??? – user983983

+0

@ user983983 Sie können '*' anstelle von 1 verwenden, aber für die Leistung verwenden Sie nicht '*'. Beide funktionieren gleich –

+0

Warum denkst du, dass dies das Problem lösen wird, wenn '*' funktionieren sollte? –

0

Sie können den Code unten als Alternative versuchen, wenn vorhanden

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 

Hoffnung, das hilft.

0

Im Allgemeinen für Szenarien, in denen Sie Folgendes tun möchten: "Aktualisieren/Löschen eines vorhandenen Datensatzes falls vorhanden oder Einfügen einer neuen Zeile, wenn der Datensatz nicht existiert", können Sie den von Oracle bereitgestellten MERGE-Befehl verwenden.

-Link: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm

PSB das folgende Beispiel von Oracle zur Verfügung gestellt:

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 ; 

Probleme:

  1. es für jeden END IFIF Aussage sein muss;
  2. ich mit mysql mein Verfahren erstellt so nach documentation:

Wenn Sie das mysql Client-Programm verwenden, um eine gespeicherte Programm enthält Semikolon Zeichen zu definieren, tritt ein Problem auf. Standardmäßig erkennt mysql selbst das Semikolon als Trennzeichen für Anweisungen, daher müssen Sie das Trennzeichen vorübergehend neu definieren, damit mysql die gesamte gespeicherte Programmdefinition an den Server weitergibt.

0

dann versuchen zu setzen, bevor auch BEGIN versuchen END zu setzen, wenn nach der letzten Zeile

Hoffnung dieser Arbeit:

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**